2015-02-16 9 views
7

Sto semplicemente cercando di decodificare la stringa \ uXXXX \ uXXXX \ uXXXX. Ma ottengo un errore:UnicodeEncodeError: il codec 'ascii' non può codificare i caratteri nella posizione 0-5: ordinale non compreso nell'intervallo (128)

$ python 
Python 2.7.6 (default, Sep 9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print u'\u041e\u043b\u044c\u0433\u0430'.decode('utf-8') 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/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 characters in position 0-4: ordinal not in range(128) 

Sono un principiante di Python. Qual è un problema? Grazie!

+0

Perché si desidera ** decodificare ** dati già decodificati? –

+0

Il problema è che stai usando Python 2, dove c'è un metodo '.decode' ingannevole disponibile sulle stringhe Unicode. Usa 'python3' e il problema scompare magicamente, dato che' u '' decode' causerebbe 'AttributeError: '' l'oggetto 'str' non ha invece alcun attributo 'decode''. –

risposta

14

Python sta cercando di essere utile. È impossibile decodificare i dati Unicode, è già decodificato. Quindi Python per prima cosa codificherà codifica i dati (usando il codec ASCII) per ottenere i byte da decodificare. È questa codifica implicita che fallisce.

Se si dispone di dati Unicode, ha senso solo per codificare a UTF-8, non decodificare:

>>> print u'\u041e\u043b\u044c\u0433\u0430' 
Ольга 
>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8') 
'\xd0\x9e\xd0\xbb\xd1\x8c\xd0\xb3\xd0\xb0' 

Se si voleva un valore Unicode, quindi utilizzando un Unicode letterale (u'...') è tutto dovevi farlo Non è necessaria ulteriore decodifica.

La stessa conversione implicita ha luogo nella direzione opposta; se si è tentato di codificare un bytestring che ci si attivare un decodifica implicita:

>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8').encode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) 
+0

Attualmente utilizzo 'msg = msg + u" @ id% s (% s) \ n "% (u [" id "], u [" first_name "]. Encode ('utf8')) ' e 'stampa msg' code. E mi dà un errore nella clausola 'print'. –

+0

@SergiiMatrunchyk: Non è quello che la tua domanda stava chiedendo però. Il tuo terminale o console sono configurati correttamente per gestire i caratteri che stai tentando di stampare? –

+0

@SergiiMatrunchyk: inoltre, perché stai * codificando * e poi interpolando in una stringa unicode? Stai mettendo quei valori in un oggetto 'u' ... '. Unicode, non dovresti codificare i valori che stai interpolando. –

9

è possibile impostare la codifica predefinita UTF-8.

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
+3

Cattiva idea. E 'un brutto, cattivo trucco per le persone che non capiscono la codifica: https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/ –

+0

Grazie Alastair McCormack per il tuo suggerimento –

+2

Do ** not ** usa questa soluzione [cargo cult] (https://en.wikipedia.org/wiki/Cargo_cult_programming). 'sys.setdefaultencoding' viene rimosso dal modulo per un motivo, cambiando la codifica implicita predefinita di Python 2 si possono rompere librerie di terze parti che si basano sul comportamento normale. –

Problemi correlati