[Python] Usare Unicode e charset

Marco Mariani marco.mariani a prometeia.it
Gio 3 Dic 2009 10:23:56 CET


Massimo Capanni wrote:

>> Si, e non solo.
>> Una stringa contiene del testo ed il testo è differente da una sequenza
>> di bytes.
>>     
>
> ecco, ora i dubbi ricrescono ... :)
>   

Intanto riassumiamo, se hai ancora dubbi e' meglio chiarire.


Stringa unicode (u'hello world'): sequenza di codepoint.
Ci sono oltre un milione di codepoint differenti, ognuno rappresentato 
da 1 a 5-6 byte
Una stringa unicode NON PUO' essere scritta su file, mostrata a 
terminale, inviata attraverso la rete... deve prima essere convertita in 
byte.

Stringa ascii, utf-8, latin-1, etc...: sequenza di byte.

Per passare dall'una all'altra, ci sono i metodi encode(), decode(), i 
tipi str() e unicode() e i moduli codecs, unicodedata, etc..


E' cosa buona e giusta all'interno del tuo programma il trattamento del 
testo in formato unicode (quindi NON utf-8!) e la codifica/decodifica 
solamente durante le operazioni di serializzazione.

La codifica del sorgente del tuo programma, invece, di default e' ASCII 
per Python < 3 e UTF-8 per Python >= 3
Questo defaultencoding, essendo globale, non si tocca.
In site.py viene tolto il metodo sys.setdefaultencoding - chi lo 
resuscita per chiamarlo sta facendo casino.

Se ASCII non ti basta, controlla di avere l'editor configurato per UTF-8 
e metti
# -*- coding: utf-8 -*-

in testa ai tuoi file.

In questo modo,  a = 'àè' sara' una stringa di 4 byte, la 
rappresentazione UTF-8 delle due vocali accentate

Invece a=u'àè' sara' una stringa unicode di 2 codepoint.


 >>> len('àè')
4
 >>> len(u'àè')
2
 >>>

La rappresentazione INTERNA, in memoria, delle stringhe unicode non deve 
interessarti minimamente, puo' cambiare da una versione di Python 
all'altra, e ci sono dei buoni motivi perche' questa non sia UTF-8.
Diciamo che internamente Python memorizza le stringhe unicode in formato 
Antani che e' una ricetta segreta di Guido.




-- 
This e-mail (and any attachment(s)) is strictly confidential and for use only by intended recipient(s). Any use, distribution, reproduction or disclosure by any other person is strictly prohibited. The content of this e-mail does not constitute a commitment by the Company except where provided for in a written agreement between this e-mail addressee and the Company. If you are not an intended recipient(s), please notify the sender promptly and destroy this message and its attachments without reading or saving it in any manner. Any non authorized use of the content of this message constitutes a violation of the obligation to abstain from learning of the correspondence among other subjects, except for more serious offence, and exposes the person responsible to the relevant consequences.



Maggiori informazioni sulla lista Python