2010-04-21 16 views
5

Qualcuno sa perché le funzioni di conversione stringa generano eccezioni quando viene passato l'errore = "ignora"? Come posso convertire da normali oggetti di stringa Python in unicode senza che vengano lanciati errori? Grazie mille!eccezioni con python unicode funzioni di codifica/decodifica (perché non errori = ignora effettivamente ignorarle ??)

python -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 

rendimenti
traceback (chiamata più recente scorso):
di file "", linea 1, in
File "/usr/lib/python2.6/codecs.py", linea 686, in scrivere
ritorno self.writer.write (dati)
File "/usr/lib/python2.6/codecs.py", la linea 351, in scrittura
dati, consumata = self.encode (oggetto, self.errors
UnicodeDecodeError: il codec 'ascii' non può decodificare il byte 0xd0 in posizione 0: ordinale non compreso nell'intervallo (128)

EDIT - grazie per le risposte, ma qualcuno sa come convertire il letterale sopra, non usando il prefisso "u"? Il motivo è che potresti, naturalmente, avere a che fare con qualcosa che non era una costante :)

risposta

2

In uso Python 2.x scrittura (' кошка'.decode ('utf-8') invece di scrittura ('кошка').

È possibile utilizzare altra codifica troppo invece di 'utf-8'.

Speriamo che non generi alcun errore ...

3

Il metodo write (in Python 2) accetta un oggetto unicode e tu lo stai passando pertanto la chiamata encode nella riga 351 codecs.py tenta innanzitutto di creare un oggetto Unicode (con il codec predefinito, 'ascii'). Fix è semplice: cambiare il write chiamata a

write(u'кошка') 

Il prefisso u dice Python si sta utilizzando un oggetto Unicode, e dovrebbe andare bene.

+0

Questa è la risposta migliore. Fornisce la compatibilità in avanti con Python 3. – Alan

1

problema è qui === >>>> scrittura ('кошка')

Si sta scrivendo un oggetto str, il destinatario si aspetta un oggetto Unicode, quindi prova a convertire in Unicode usando il default codifica (aSCII), che naturalmente (?) produce il noto (?) UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)

il punto di utilizzare il modulo codecs genere è per farlo convertire il unicode oggetti utf8-codificato sul al volo - in modo da alimentarlo unicode

Aggiornamento Come convertire la letterale o non letterale:

unicode_object = literal_or_whatever.decode ("UNKNOWN_ENCODING")

Sai come il tuo letterale è codificato? Vorresti dirci cosa stai cercando di realizzare? A uno di linea con python -c non è di grande aiuto ;-)

+0

la funzione unicode() non funziona, genera la stessa eccezione. – gatoatigrado

+0

@gatoatigrado: ho detto di dargli da mangiare unicode; Non ho detto di usare la funzione 'unicode()'. Se si utilizza 'unicode()' senza specificare una codifica, OF COURSE otterrà la stessa eccezione (la codifica predefinita è ascii). E per favore leggi l'ultima frase della mia risposta. –

+0

ah, scusa, stavo scannerizzando, mi dispiace. La domanda era "come" posso alimentarlo unicode da una stringa di Python. Il modo logico sarebbe 'unicode (pystr)', ma questo non funziona. Penso di aver già usato trucchi stupidi con bytes(), ma mi piacerebbe sapere qual è la vera soluzione. – gatoatigrado

2

una non-soluzione di (da domanda autore) Ho appena scoperto: l'uso python3

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 
+0

Sì, Python 3 ha il supporto Unicode nativo. =] –

Problemi correlati