UnicodecodeError: 'ascii' codec kan'niet decoderen byte 0xef op positie 1

Ik'heb een paar problemen met het coderen van een string naar UTF-8. Ik'heb verschillende dingen geprobeerd, inclusief het gebruik van string.encode('utf-8') en unicode(string), maar ik krijg de foutmelding:

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

Dit is mijn string:

(。・ω・。)ノ

Ik zie niet wat er fout gaat, enig idee?

Edit: Het probleem is dat het afdrukken van de string zoals hij is, niet goed wordt weergegeven. Ook krijg ik deze foutmelding als ik het probeer om te zetten:

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

Dit heeft te maken met het feit dat de encoding van je terminal niet op UTF-8 is ingesteld. Hier is mijn 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
(。・ω・。)ノ
>>> 

Op mijn terminal werkt het voorbeeld met het bovenstaande, maar als ik de LANG instelling weglaat dan werkt het niet'en

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

Raadpleeg de docs voor je linux variant om te ontdekken hoe je deze wijziging permanent kunt maken.

Commentaren (1)

Probeer:

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') gives u'(\uff61\uff65\u03c9\uff65\uff61)\uff89', which is correct.

dus uw probleem moet ergens anders zitten, mogelijk als u er iets mee probeert te doen waar een impliciete conversie plaatsvindt (zou kunnen zijn afdrukken, schrijven naar een stream...)

om meer te zeggen moeten we wat code zien.

Commentaren (5)

Het lijkt erop dat je string is gecodeerd naar utf-8, dus wat is precies het probleem? Of wat probeer je hier te doen...?

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