108 votes

UnicodeDecodeError: 'ascii' codec ne peut pas décoder les octets 0xef en position 1

Je vais avoir quelques problèmes en essayant de coder une chaîne de caractères UTF-8. J'ai essayé de nombreuses choses, y compris à l'aide de string.encode('utf-8') et unicode(string), mais j'obtiens l'erreur:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1: ordinal not in range(128)

Ceci est ma chaîne:

(。・ω・。)ノ

Je ne vois pas ce qui ne va pas, une idée?

Edit: Le problème est que l'impression de la chaîne, comme c'est de ne pas afficher correctement. Aussi, ce message d'erreur quand j'essaie de le convertir:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)

71voto

Nick Craig-Wood Points 18742

C'est à voir avec le codage de votre terminal n'étant pas défini à l'UTF-8. Voici mon terminal

$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> 

Sur mon terminal de l'exemple fonctionne avec le ci-dessus, mais si je me débarrasser de l' LANG puis ça ne marchera pas

$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

Consulter la documentation pour linux variante de découvrir comment faire ce changement permanent.

24voto

mata Points 22446

essayez:

string.decode('utf-8')  # or:
unicode(string, 'utf-8')

edit:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') donne u'(\uff61\uff65\u03c9\uff65\uff61)\uff89', ce qui est correct.

si votre problème doit être à certains oter place, peut-être si vous essayez de faire quelque chose avec elle étaient il y a une conversion implicite passe (peut-être l'impression, l'écriture d'un ruisseau...)

pour en dire plus, nous aurons besoin de voir un peu de code.

22voto

pepr Points 4263

Mon +1 pour mata commentaire http://stackoverflow.com/a/10561979/1346705 et pour le Pseudo Craig-Bois de la démonstration. Vous avez décodé la chaîne correctement. Le problème est avec l' print commande comme il convertit la chaîne Unicode à la console de codage, et la console n'est pas capable d'afficher de la chaîne. Essayez d'écrire la chaîne de caractères dans un fichier et regardez le résultat à l'aide de quelques bons éditeur qui prend en charge Unicode:

import codecs

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

Ensuite, vous verrez (。・ω・。)ノ.

10voto

Tsutomu Points 749

Si vous travaillez sur une distance d'accueil, regardez - /etc/ssh/ssh_config sur votre local PC.

Lorsque ce fichier contient une ligne:

SendEnv LANG LC_*

en commentaire avec l'ajout d' # à la tête de la ligne. Cela pourrait aider.

Avec cette ligne, ssh envoie liées au langage des variables d'environnement de votre PC à distance de l'hôte. Il provoque beaucoup de problèmes.

1voto

wim Points 35274

Il ressemble à votre chaîne est codée utf-8, alors quel est le problème exactement? Ou de ce que vous essayez de faire ici..?

Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'

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