User Tools

Site Tools


doc:appunti:prog:python_unicode

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
doc:appunti:prog:python_unicode [2012/12/03 20:58] – [Input: lettura da database] niccolodoc:appunti:prog:python_unicode [2013/01/28 13:09] – [Nomi di file e directory] niccolo
Line 25: Line 25:
 </code> </code>
  
-La funzione **''type()''** restituisce **''unicode''**, questo vuol dire che Python ha saputo decodificare l'input grazie alla dichiarazione del parametro **''charset''** nella **''connect()''** e memorizza internamente la stringa nel formato ottimale unicode. Questo consente a Python di far funzionare bene tutte le funzioni stringa, ad esempio anche i caratteri multibyte vengono conteggiati correttamente di lunghezza 1 quando si applica la funzione **''len()''**.+La funzione **''type()''** restituisce **''unicode''**, questo vuol dire che Python ha saputo decodificare correttamente l'input (grazie alla dichiarazione del parametro **''charset''** nella **''connect()''**e memorizza internamente la stringa nel formato ottimale unicode. Questo consente a Python di operare correttamente sulle stringhe, ad esempio quando si applica la funzione **''len()''** i caratteri multibyte vengono valutati correttamente di lunghezza pari a uno. 
 + 
 +Se si omette la dichiarazione del **''charset''** nella ''connect()'', la stringa letta dal database avrebbe un generico **''type() = str''**. Per decodificare correttamente il contenuto bisognerebbe modificare il programma come segue: 
 + 
 +<code python> 
 +curs.execute("SET CHARACTER SET utf8"
 +curs.execute("SELECT * FROM table"
 +rows = curs.fetchall() 
 +for row in rows: 
 +    field0 = row[0].decode('utf-8'
 +    print type(field0), field0 
 +    ... 
 +</code> 
 + 
 +===== Input/Output: lettura/scrittura da pipe ===== 
 + 
 +Se si deve comunicare con un programma esterno utilizzando UTF-8 conviene come al solito memorizzare le stringhe in unicode e quindi esplicitare l'encoding sia per l'input che per l'output: 
 + 
 +<code python> 
 +text = u"ditemi <b>perché</b> se la mucca fa mu..." 
 +subproc = subprocess.Popen(["pandoc", "-f", "html", "-t", "LaTeX"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
 +output, stderr = subproc.communicate(input=text.encode('utf-8')) 
 +output = output.decode('utf-8'
 +</code> 
 + 
 +La stringa **''output''** sarà di tipo ''unicode'', al momento di stamparla si dovrà eventualmente decidere (forzare) l'encoding opportuno per evitare conseguenze impreviste (vedi avanti).
 ===== Output: codifica implicita della print ===== ===== Output: codifica implicita della print =====
  
Line 34: Line 59:
 </code> </code>
  
-codifica il contenuto di ''string'' in base all'output: se si tratta di ''stdout'' viene usata la codifica **''utf-8''** (per della variabile d'ambiente **''LANG=en_US.UTF-8''**), se invece si ridirige l'output su file (oppure la variabile ''LANG'' non è impostata correttamente) viene usata la codifica **''ascii''** ed eventualmente scatta l'errore:+codifica il contenuto di ''string'' in base all'output: se si tratta di ''stdout'' viene usata la codifica **''utf-8''** (per via della variabile d'ambiente **''LANG=en_US.UTF-8''**), se invece si ridirige l'output su file (oppure la variabile ''LANG'' non è impostata correttamente) viene usata la codifica **''ascii''** ed eventualmente scatta l'errore:
  
 <code> <code>
Line 44: Line 69:
 <code python> <code python>
 print string.encode('utf-8') print string.encode('utf-8')
 +</code>
 +
 +===== Nomi di file e directory =====
 +
 +Alcune funzioni relative al filesystem potrebbero causare problemi, ad esempio:
 +
 +<code python>
 +os.path.isfile(filename)
 +os.stat(filename)
 +</code>
 +
 +potrebbe fallire con:
 +
 +<code>
 +UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 79: ordinal not in range(128)
 +</code>
 +
 +La soluzione è codificare esplicitamente la stringa prima di passarla alla funzione:
 +
 +<code python>
 +os.path.isfile(filename.encode('utf-8'))
 +os.stat(filename.encode('utf-8'))
 </code> </code>
  
doc/appunti/prog/python_unicode.txt · Last modified: 2015/07/17 09:50 by niccolo