2011-01-25 18 views
7

Estoy tratando de imprimir una cadena Unicode sin el hex específico de codificación. Estoy tomando estos datos de Facebook que tiene un tipo de codificación en los encabezados html de UTF-8. Cuando imprimo el tipo, dice que es unicode, pero cuando intento decodificarlo con unicode, escape dice que hay un error de codificación. ¿Por qué está tratando de codificar cuando uso el método de decodificación?La función de decodificación intenta codificar Python

Código

a='really long string of unicode html text that i wont reprint' 
print type(a) 
>>> <type 'unicode'> 
print a.decode('unicode-escape') 
>>> Traceback (most recent call last): 
    File "scfbp.py", line 203, in myFunctionPage 
    print a.decode('unicode-escape') 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128) 

Respuesta

8

No es la decodificación que está fallando. Es porque estás tratando de mostrar el resultado a la consola. Cuando usa print codifica la cadena usando la codificación predeterminada que es ASCII. No use la impresión y debería funcionar.

 
>>> a=u'really long string containing \\u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
u'really long string containing \u20ac and some other text' 
>>> print a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 

Recomendaría usar IDLE o algún otro intérprete que pueda generar unicode, entonces no obtendrá este problema.


Actualización: Tenga en cuenta que esto no es el mismo que el situtation con uno menos barra invertida, donde falla durante la decodificación, pero con el mismo mensaje de error:

 
>>> a=u'really long string containing \u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 
+0

Esta no es la razón de su error. Él está tratando de decodificar un objeto Unicode. Como usted decodifica datos binarios a datos unicode, Python 2 primero * codificará * it, lo cual hará con el códec ascii. Eso es lo que está fallando. –

+0

@Lennart Regebro: en realidad, sospecho que el tipo real de su cadena es 'str', no' unicode'. Mira cómo está inicializando la cuerda: fíjate que no hay 'u'. Creo que lo que tiene no es una cadena unicode, sino una cadena * unicode-escaped * (¡no es lo mismo!). Esto es lo que intenta decodificar para unicode. Si mi teoría es correcta, entonces creo que esta respuesta es realmente correcta. –

+0

@Mark Byers: Es cierto, eso es inconsistente, pero omitir u es más fácil que escribir el tipo incorrecto. :) Y el error es consistente con lo que hace. Si decodifica un objeto Unicode, obtiene un error de codificación. –

3

Cuando se imprime a la consola Python intenta codificar (convertir) la cadena al conjunto de caracteres de su terminal. Si esto no es UTF-8, o algo que no correlaciona todos los caracteres de la cadena, silbará y emitirá una excepción.

Esto me atrapa de vez en cuando cuando realizo un procesamiento rápido de datos, con por ejemplo caracteres turcos en él.

Si está ejecutando python.exe a través del símbolo del sistema de Windows, puede encontrar algunas soluciones aquí: What encoding/code page is cmd.exe using. Básicamente puede cambiar la página de códigos con chcp, pero es bastante engorroso. Seguiría Mark's advice y usaré algo así como IDLE.

+1

¿Cuidar para explicar el -1? – Skurmedel

1
>>> print type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 

¿Por qué se trata de codificar cuando se utiliza el método de decodificación?

Debido a descifrar a Unicode y codificar de. Acabas de intentar decodificar una cadena Unicode para Unicode. Lo primero que hace es intentar convertirlo en una cadena, con el códec ascii. Es por eso que obtiene:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2110' in position 3: ordinal not in range(128) 

Recuerde: Unicode no es una codificación. Todo lo demás es, como ascii, utf8, latin-1, etc.

Esta codificación implícita ha desaparecido en Python 3, por cierto, porque confunde a las personas.

Cuestiones relacionadas