[Python] Usare Unicode e charset

Massimo Capanni massimo.capanni a gmail.com
Mer 2 Dic 2009 21:32:51 CET


Il 02 dicembre 2009 18.32, Manlio Perillo <manlio_perillo a libero.it> ha scritto:
> Massimo Capanni ha scritto:
>> Salve,
>>
>>  confesso che ho un po' di timore a postare questo thread,
>
> e perchè mai?
>
perche' e' un vero salto nel buio :)
a volte mi piacerebbe avere uno di quei libri con la semantica di
python (se esistono),
come all'universita' li avevo per il pascal e capire che fine fa il
codice che scrivi ...

[..]

> Ci sono due informazioni in cui Python ha bisogno di conoscere
> l'encoding usato.
>
> Il primo caso è quando, nel listato del programma, hai una string literal.
> In questo caso l'encoding è necessario in fase di parsing del programma.
>
> Nel caso in cui l'interprete è eseguito in modalità interattiva, questa
> informazione viene ricavata dal sistema operativo.
> In modalità batch questa informazione deve essere dichiarata dal
> programmatore nel file che contiene il programma.
>

e infatti cosi' sembra funzionare:

(ho impostato notepad++ su utf-8 senza BOM)

----------------------------------------------
# -*- coding: UTF-8 -*-

file = open("prova.txt", "w")
x = 'àòàòàòàò'
file.write(x)
file.close()
----------------------------------------------

> Il secondo caso è quando converti una stringa normale in Unicode.
>
>>>> byte_string = 'àè'
>>>> s = unicode(byte_string)
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
> ordinal not in range(128)
>
>>>> import sys
>>>> reload(sys)

perche' reload(sys)?

> <module 'sys' (built-in)>
>>>> sys.setdefaultencoding('utf-8')
>>>> s = unicode(byte_string)
>>>>
>
> Nel mio caso, sono su Linux ed ho il locale impostato a `it_IT.utf8`.
>

sul mio Wxp invece:

----------------------------------------------
>>> import sys
>>> reload(sys)
>>> sys.setdefaultencoding('Windows-1252') # codifica di windows
>>> x = 'ò'
>>> s = unicode(x)
>>> s
u'\u2022'

dal quale:

>>> print s.encode()
ò

ok, effettivamente adesso le cose cominciano leggermente a tornare :)

Concludo quindi il mio post con Unicode: conviene trattare tutte le
stringhe come
Unicode per evitare problemi di portabilita'?

>
> Ciao  Manlio

grazie infinite :)


Maggiori informazioni sulla lista Python