UnicodeDecodeError: 'ascii' Codec kann Byte 0xef an Position 1 nicht dekodieren

Ich habe ein paar Probleme beim Versuch, eine Zeichenfolge in UTF-8 zu kodieren. Ich habe zahlreiche Dinge versucht, einschließlich der Verwendung von string.encode('utf-8') und unicode(string), aber ich erhalte den Fehler:

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

Dies ist meine Zeichenkette:

(。・ω・。)ノ

Ich verstehe nicht, was da schief läuft, irgendeine Idee?

Edit: Das Problem ist, dass das Drucken der Zeichenfolge, wie es ist, nicht richtig angezeigt. Auch dieser Fehler, wenn ich versuche, es zu konvertieren:

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)
Lösung

Das hat damit zu tun, dass die Kodierung Ihres Terminals nicht auf UTF-8 eingestellt ist. Hier ist mein 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
(。・ω・。)ノ
>>> 

Auf meinem Terminal funktioniert das Beispiel mit dem oben genannten, aber wenn ich die LANG-Einstellung loswerde, funktioniert es nicht.

$ 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 "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

Konsultieren Sie die Dokumentation für Ihre Linux-Variante, um herauszufinden, wie Sie diese Änderung dauerhaft machen können.

Kommentare (1)

versuchen:

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

bearbeiten:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') gives u'(\uff61\uff65\u03c9\uff65\uff61)\uff89', which is correct.

Ihr Problem muss also an einer anderen Stelle liegen, möglicherweise wenn Sie versuchen, etwas damit zu tun, wo eine implizite Konvertierung stattfindet (z.B. Drucken, Schreiben in einen Stream...)

Um mehr zu sagen, müssen wir etwas Code sehen.

Kommentare (5)

Es sieht so aus, als ob Ihre Zeichenkette in utf-8 kodiert ist, was genau ist also das Problem? Oder was versuchen Sie hier zu tun...?

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'
Kommentare (1)