2011-01-25 7 views
7

Sto provando a stampare una stringa unicode senza l'esadecimale di codifica specifico. Sto prendendo questi dati da Facebook che ha un tipo di codifica nelle intestazioni HTML di UTF-8. Quando stampo il tipo - dice il suo unicode, ma poi quando provo a decodificarlo con unicode-escape dice che c'è un errore di codifica. Perché sta cercando di codificare quando utilizzo il metodo di decodifica?La funzione di decodifica tenta di codificare Python

Codice

a='really long string of unicode html text that i wont reprint' 
print type(a) 
>>> <type 'unicode'> 
print a.decode('unicode-escape') 
>>> Traceback (most recent call last): 
    File "scfbp.py", line 203, in myFunctionPage 
    print a.decode('unicode-escape') 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128) 

risposta

8

Non è la decodifica che sta fallendo. È perché stai cercando di mostrare il risultato alla console. Quando usi print codifica la stringa usando la codifica predefinita che è ASCII. Non usare la stampa e dovrebbe funzionare.

 
>>> a=u'really long string containing \\u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
u'really long string containing \u20ac and some other text' 
>>> print a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 

Mi consiglia di utilizzare IDLE o qualche altro interprete che può produrre unicode, quindi non sarà possibile ottenere questo problema.


Aggiornamento: Si noti che questa non è la stessa come il situtation con una sola barra rovesciata meno, dove non riesce durante la decodifica, ma con lo stesso messaggio di errore:

 
>>> a=u'really long string containing \u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 
+0

Questo non è il motivo del suo errore. Sta cercando di decodificare un oggetto Unicode. Dal momento che decodificate da dati binari a dati unicode, Python 2 lo * prima codificherà *, cosa che fa con il codec ascii. Questo è ciò che sta fallendo. –

+0

@Lennart Regebro: In realtà sospetto che il tipo effettivo della sua stringa sia 'str', non' unicode'. Guarda come sta inizializzando la stringa - nota che non c'è "u". Penso che quello che ha non sia una stringa unicode, ma una stringa * unicode-escape * (non la stessa cosa!). È questo che sta cercando di decodificare in unicode. Se la mia teoria è giusta, allora penso che questa risposta sia effettivamente corretta. –

+0

@Mark Byers: è vero, è incoerente, ma perdere u è più semplice che digitare il tipo sbagliato. :) E l'errore è coerente con quello che fa. Se decodificate un oggetto Unicode, ottenete un errore di codifica. –

3

Quando si stampa alla console Python prova a codificare (convertire) la stringa sul set di caratteri del tuo terminale. Se questo non è UTF-8 o qualcosa che non mappa tutti i caratteri nella stringa, si lamenterà e genererà un'eccezione.

Questo mi trascina di tanto in tanto quando eseguo l'elaborazione rapida dei dati, con ad esempio caratteri turchi.

Se si esegue python.exe tramite il prompt dei comandi di Windows è possibile trovare alcune soluzioni qui: What encoding/code page is cmd.exe using. Fondamentalmente è possibile modificare la codepage con chcp ma è piuttosto ingombrante. Vorrei seguire Mark's advice e utilizzare qualcosa come IDLE.

+1

Cura di spiegare il -1? – Skurmedel

1
>>> print type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 

Perché è cercando di codificare quando uso il metodo di decodifica?

Perché a decodificare - Unicode, e si codifica da. Hai appena provato a decodificare una stringa unicode in unicode. La prima cosa che fa è provare a convertirlo in una stringa, con il codec ascii. Ecco perché ottieni:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2110' in position 3: ordinal not in range(128) 

Ricorda: Unicode non è una codifica. Tutto il resto è, come ascii, utf8, latino-1 ecc.

Questa codifica implicita è scomparsa in Python 3, btw, perché confonde le persone.