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
Last revisionBoth sides next revision
doc:appunti:prog:python_unicode [2012/12/03 21:05] – [Input: lettura da database] niccolodoc:appunti:prog:python_unicode [2013/10/12 08:05] – [Input: lettura da database] niccolo
Line 5: Line 5:
 Oppure queste slide: **[[http://farmdev.com/talks/unicode/|Unicode In Python, Completely Demystified]]**. Oppure queste slide: **[[http://farmdev.com/talks/unicode/|Unicode In Python, Completely Demystified]]**.
  
-===== Input: lettura da database =====+===== Input: lettura da database MySQL =====
  
 Si assume che nel database i campi testo siano codificati UTF-8. Sarebbe opportuno che il charset del database sia dichiarato UTF-8 in fase di creazione dello stesso; con PostgreSQL si tratta dell'impostazione predefinita, con MySQL invece no. Con MySQL è comunque possibile memorizzare testo UTF-8 anche se il charset dichiarato è quello predefinito **''latin1''**, per fortuna perché MySQL ha ancora molti problemi nella gestione di UTF-8 (spazio occupato dalle stringhe, limiti nella dimensione degli indici, ecc.). Si assume che nel database i campi testo siano codificati UTF-8. Sarebbe opportuno che il charset del database sia dichiarato UTF-8 in fase di creazione dello stesso; con PostgreSQL si tratta dell'impostazione predefinita, con MySQL invece no. Con MySQL è comunque possibile memorizzare testo UTF-8 anche se il charset dichiarato è quello predefinito **''latin1''**, per fortuna perché MySQL ha ancora molti problemi nella gestione di UTF-8 (spazio occupato dalle stringhe, limiti nella dimensione degli indici, ecc.).
Line 38: Line 38:
     ...     ...
 </code> </code>
 +
 +===== Input/Output: da database PostgreSQL =====
 +
 +Con queste istruzioni si apre una connessione al database e ci si assicura che tutte le stringhe che vengono lette siano di **''<type 'unicode'>''**:
 +
 +<code python>
 +import psycopg2
 +import psycopg2.extensions
 +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
 +psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
 +
 +conn = psycopg2.connect(host = "127.0.0.1", database = "dbname", user="dbuser", password="dbpass")
 +conn.set_client_encoding("UTF8")
 +curs = conn.cursor()
 +</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 46: Line 73:
 </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 56: Line 83:
 <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