[Python] Usare Unicode e charset

Massimo Capanni massimo.capanni a gmail.com
Mer 2 Dic 2009 18:05:39 CET


Salve,

 confesso che ho un po' di timore a postare questo thread,
 per il fatto che sono tre giorni che cerco di capire questo argomento
 e ad ogni articolo che studio in merito mi sembra di fare un passo indietro
 su quello che ho imparato.

Comunque, ecco la mia situazione: Windows Xp e Python 2.4.6
Tutto e' cominciato ignorando (mea culpa) questo problema:

Listato [1]
---------------------------------
file = open("prova.txt", "w")
x = 'атататат'
file.write(x)
file.close()
---------------------------------

e il prompt dei comandi mi risponde con:

----------------------------------------
C:\_DATI\pylab>python prova.py
  File "prova.py", line 2
SyntaxError: Non-ASCII character '\xe0' in file prova.py on line 2, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for
details
----------------------------------------

Visto che l'interprete mi consiglia di leggere il link relativo nel messaggio
di errore gli do un'occhiata e provo ad aggiungere :

# -*- coding: utf-8 -*-

e tutto funziona.

Se invece da shell Python scrivo:

Listato [2]
---------------------------------
>>> x = "аатат"
>>> print x
аатат
>>> f = open("pippo.txt", "w")
>>> f.write(x)
>>> f.close()
---------------------------------

leggendo il file pippo.txt l'output mi stampa:

> аатат

E qui inziano i miei dubbi.

Anzitutto a quanto ho capito dalla documentazione in giro, Python di
default utilizza il charset 'ascii', infatti se eseguo queste due istruzioni
dalla shell ottengo:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

tuttavia in Listato [2] scrivo tranquillamente nel file la stringa x
che non rientra
nel charset. Ora, se comprendessi il meccanismo alla base di tutto forse capirei
tutto il resto.

Provo a fare delle ipotesi:

ho tre soggetti: il sistema sul quale lavoro, l'editor, Python. Il
sistema possiede il
suo charset (ad esempio la cmd di windows mi riporta 437). L'editor lo imposto
sul charset che desidero (di sistema o utf-8 ad esempio). Quindi (in
teoria) Python
nel momento che interpreta le istruzioni del file dovrebbe fare in
modo che i caratteri
del charset del sistema coincidano con quelli che ho pensato di utilizzare con
l'editor (a ragione l'inserimento di # -*- coding: utf-8 -*- nel
listato [1]) e se non sa
come comportarsi si ferma con un errore.
Sarebbe anche da ipotizzare che Python sappia che charset utilizzi il sistema?

Invece in listato [2] funziona anche senza impostare il charset, a
meno che per 'ascii'
Python non intenda un ascii 'esteso'.

Mi fermo qui, perche' se non comprendo questo argomento non posso pretendere
di chiedere qualcosa sulla codifica in unicode ...

Scusatemi se mi sono dilungato, ma spero di aver descritto bene il problema.


Maggiori informazioni sulla lista Python