web-dev-qa-db-fra.com

UnicodeEncodeError: le codec 'ascii' ne peut pas coder les caractères en position 0-5: l'ordinal n'est pas dans la plage (128)

J'essaie simplement de décoder la chaîne de type\uXXXX\uXXXX\uXXXX. Mais je reçois une erreur:

$ 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)

Je suis Python débutant. Quel est le problème? Merci!

12
Serhii Matrunchyk

Python essaie d'être utile. Vous ne pouvez pas décoder les données Unicode, elles sont déjà décodées. Donc Python va d'abord encoder les données (en utilisant le ASCII codec) pour obtenir les octets à décoder. C'est cet encodage implicite qui échoue.

Si vous avez des données Unicode, cela n'a de sens que de encoder en UTF-8, pas de décoder:

>>> 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'

Si vous vouliez une valeur Unicode, puis en utilisant un littéral Unicode (u'...') est tout ce que vous deviez faire. Aucun décodage supplémentaire n'est nécessaire.

La même conversion implicite a lieu dans l'autre sens; si vous tentiez de coder un bytestring, vous déclencheriez un décodage implicite:

>>> 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)
21
Martijn Pieters

vous pouvez définir l'encodage par défaut utf-8.

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')
13
Ranvijay Sachan