128 votes

Python - Le codec 'ascii' ne peut pas décoder d'octet

Je suis vraiment confus. J'ai essayé d'encoder mais l'erreur disait "impossible de décoder ...". Que fait Python sous le capot?

 >>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
 

170voto

Winston Ewert Points 17746
 "你好".encode('utf-8')
 

encode convertit un objet unicode en un objet string . Mais ici vous l'avez invoqué sur un objet string (car vous n'avez pas le u). Donc, python doit d'abord convertir l'objet string en un objet unicode . Donc, cela équivaut à

 "你好".decode().encode('utf-8')
 

Mais le décodage échoue car la chaîne n'est pas valide en ascii. C'est pourquoi vous recevez une plainte concernant l'impossibilité de décoder.

54voto

wim Points 35274

Toujours coder unicode en octets.
Dans cette direction, vous aurez à choisir l'encodage.

>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好

L'autre façon est de décoder des octets unicode.
Dans ce sens, vous devez savoir ce qu'est l'encodage.

>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好

Si vous voyez d'autres combinaisons en python 2.x, c'est à dire my_byte_string.encode() ou my_unicode_string.decode(), alors la personne qui a écrit le code ne savais pas vraiment ce qu'ils faisaient, et a été tout simplement jouer unicode whack-a-mole.

En le voyant, .encode sur une chaîne d'octets, python essaie d'abord de convertir implicitement à une unicode. De même, en le voyant, .decode sur une chaîne unicode, python implicitement essaie de le convertir en octets de la première.

Donc - pourquoi êtes-vous Unicode Décoder Erreur lorsque vous avez appelé coder? Ici, UnicodeDecodeError est dû au fait que coder la fonction normalement prend un paramètre de type unicode. L'obtention d'un str paramètre, l'encode() fonction convertit en format avant la conversion vers un autre codage. La conversion-choisit un défaut ascii décodeur, vous donnant l'erreur de décodage à l'intérieur d'un encodeur.

...ou quel que soit le codage sys.getdefaultencoding() mentions; d'habitude, c'est 'ascii'

8voto

Johnsyweb Points 45395

Si vous utilisez Python <3, vous devrez dire à l'interprète que votre littéral de chaîne est Unicode en le préfixant avec u :

 Python 2.7.2 (default, Jan 14 2012, 23:14:09) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "你好".encode("utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
 

Lectures complémentaires : Unicode HOWTO .

3voto

Qingtian Points 11

Vous utilisez u"你好".encode('utf8') pour coder une chaîne unicode. Mais si vous voulez représenter "你好" , vous devez le décoder. Juste comme:

 "你好".decode("utf8")
 

Vous obtiendrez ce que vous voulez. Peut-être devriez-vous en savoir plus sur l'encodage et le décodage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X