UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1

Estoy teniendo algunos problemas al intentar codificar una cadena a UTF-8. He intentado numerosas cosas, incluyendo el uso de string.encode('utf-8') y unicode(string), pero me da el error:

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

Esta es mi cadena:

(。・ω・。)ノ

No veo qué está fallando, ¿alguna idea?

Edit: El problema es que al imprimir la cadena tal cual no se ve bien. Además, este error cuando intento convertirla:

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)
Solución

Esto tiene que ver con que la codificación de tu terminal no está configurada en UTF-8. Aquí está mi 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
(。・ω・。)ノ
>>> 

En mi terminal el ejemplo funciona con lo anterior, pero si elimino la configuración LANG entonces no funcionará

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

Consulte la documentación de su variante de linux para descubrir cómo hacer este cambio permanente.

Comentarios (1)

Inténtalo:

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

editar:

'(\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.

Así que tu problema debe estar en algún otro lugar, posiblemente si tratas de hacer algo con él donde hay una conversión implícita en marcha (podría ser la impresión, la escritura a un flujo ...)

para decir más necesitaremos ver algo de código.

Comentarios (5)

Parece que tu cadena está codificada en utf-8, así que ¿cuál es exactamente el problema? ¿O qué está tratando de hacer aquí...?

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