[Python] codifica unicode di caratteri speciali

Daniele Varrazzo piro a develer.com
Lun 4 Feb 2013 12:43:03 CET


On 2013-02-04 11:53, linediconsine a gmail.com wrote:
> Ciao credo di non aver capito come si usa questa funzione e googlando
> non ci ho capito molto riassumendo :
>
> a = "òàçòòà"
>
> a.encode('utf-8')
>
>
> mi da come errore :
>
> File "Untitled.py", line 1
>
> SyntaxError: Non-ASCII character '\xc3' in file Untitled.py on line 
> 1, but
> no encoding declared; see http://www.python.org/peps/pep-0263.html 
> for
> details
>
> Cosa mi suggerite?

Di leggere http://www.python.org/peps/pep-0263.html e di leggere sulla 
differenza tra encode e decode.

Anzi, questa te la dico io, perché questo punto penso sia disastroso in 
Python e spiegato dolorosamente male: la "direzione" di encode (ovvero: 
cos'è "la realtà" e cos'è "la sua codifica") è che la realtà è unicode, 
una stringa è una sua codifica. Le uniche operazioni che hanno senso 
sono:

- encode: trasforma unicode in una stringa. unicode.encode(encoding) -> 
str
- decode: trasforma una stringa in unicode. str.decode(encoding) -> 
unicode

Tutti gli altri metodi NON HANNO SENSO. Il problema è che esistono. 
unicode.decode() e str.encode() devono bruciare all'inferno. L'effetto 
di questi metodi è di effettuare prima l'operazione inversa in un 
encoding non definito (tipicamente ascii). Il risultato è il tuo 
programma che scoppia con...

     >>> u = u'€'
     >>> u
     u'\u20ac'
     >>> u.decode('utf8')
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
       File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
         return codecs.utf_8_decode(input, errors, True)
     UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' 
in position 0: ordinal not in range(128)

perfetto no? un errore nell'encode quando chiedi il decode? Che idea 
del cazzo.

Leggi anche il pep 263, che riguarda cosa python deve capire quando usi 
caratteri non ascii nei sorgenti, che è un problema correlato ma non è 
lo stesso (infatti tu hai un errore di sintassi, non di 
codifica/decodifica).

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python