Estoy realmente confundido. Traté de codificar pero el error decía can't decode...
.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Sé cómo evitar el error con el prefijo "u" en la cadena. Me pregunto por qué el error es "no se puede decodificar" cuando se llamó a encode. ¿Qué está haciendo Python bajo el capó?
"你好".decode('utf-8').encode('utf-8')
Codifique siempre de Unicode a bytes.
En esta dirección, puedes elegir la codificación .
La otra forma es decodificar de bytes a Unicode.
En esta dirección, debes saber cuál es la codificación .
Este punto no se puede enfatizar lo suficiente. Si desea evitar jugar unicode "whack-a-mole", es importante comprender lo que sucede a nivel de datos. Aquí se explica de otra forma:
decode
.encode
.Ahora, al ver
.encode
una cadena de bytes, Python 2 primero intenta convertirlo implícitamente en texto (ununicode
objeto). De manera similar, al ver.decode
una cadena Unicode, Python 2 implícitamente intenta convertirla en bytes (unstr
objeto).Estas conversiones implícitas son la razón por la que puede obtener cuando ha llamado . Es porque la codificación generalmente acepta un parámetro de tipo ; al recibir un parámetro, hay una decodificación implícita en un objeto de tipo antes de volver a codificarlo con otra codificación. Esta conversión elige un decodificador 'ascii' † predeterminado , lo que le da el error de decodificación dentro de un codificador.
Unicode
Decode
Error
encode
unicode
str
unicode
De hecho, en Python 3 los métodos
str.decode
ybytes.encode
ni siquiera existen. Su remoción fue un intento [controvertido] de evitar esta confusión común.† ... o lo que
sys.getdefaultencoding()
mencione la codificación ; generalmente esto es 'ascii'fuente
_
refiere al valor anterior 2. porque esta es una pregunta de python-2.x.Puedes probar esto
O
También puedes intentar seguir
Agregue la siguiente línea en la parte superior de su archivo .py.
fuente
Si está utilizando Python <3, deberá decirle al intérprete que su literal de cadena es Unicode prefijándolo con
u
:Más información : Unicode HOWTO .
fuente
Se utiliza
u"你好".encode('utf8')
para codificar una cadena Unicode. Pero si quieres representar"你好"
, debes decodificarlo. Al igual que:Obtendrás lo que quieras. Quizás debería aprender más sobre codificar y decodificar.
fuente
En caso de que esté tratando con Unicode, a veces en lugar de
encode('utf-8')
, también puede intentar ignorar los caracteres especiales, por ejemploo como se
something.decode('unicode_escape').encode('ascii','ignore')
sugiere aquí .No es particularmente útil en este ejemplo, pero puede funcionar mejor en otros escenarios cuando no es posible convertir algunos caracteres especiales.
Alternativamente, puede considerar reemplazar un carácter particular usando
replace()
.fuente
Si está iniciando el intérprete de Python desde un shell en Linux o sistemas similares (BSD, no estoy seguro de Mac), también debe verificar la codificación predeterminada del shell.
Llame
locale charmap
desde el shell (no el intérprete de Python) y debería verSi este no es el caso y ve algo más, p. Ej.
Python heredará (al menos en algunos casos, como en el mío) la codificación del shell y no podrá imprimir (¿algunos? ¿Todos?) Caracteres Unicode. La propia codificación predeterminada de Python que ve y controla a través de,
sys.getdefaultencoding()
ysys.setdefaultencoding()
en este caso se ignora.Si encuentra que tiene este problema, puede solucionarlo
(O, alternativamente, elija el mapa de teclas que desee en lugar de en_EN). También puede editar
/etc/locale.conf
(o cualquier archivo que gobierne la definición de configuración regional en su sistema) para corregir esto.fuente