Tengo algunos problemas al intentar codificar una cadena en UTF-8. He intentado varias cosas, incluido el uso de string.encode('utf-8')
y unicode(string)
, pero aparece el error:
UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xef en la posición 1: ordinal no está en el rango (128)
Esta es mi cadena:
(。・ω・。)ノ
No veo qué va mal, ¿alguna idea?
Editar: El problema es que la impresión de la cadena tal como está no se muestra correctamente. Además, este error cuando intento convertirlo:
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)
Respuestas:
Esto tiene que ver con la codificación de su terminal que no está configurada en UTF-8. Aquí está mi terminal
En mi terminal, el ejemplo funciona con lo anterior, pero si me deshago de la
LANG
configuración, no funcionaráConsulte los documentos de su variante de Linux para descubrir cómo hacer que este cambio sea permanente.
fuente
sudo apt-get install language-pack-de
osudo locale-gen de_DE.UTF-8
(para configuraciones regionales alemanas).LC_ALL
, y el valor más simple que la solucionaría esC.UTF-8
tratar:
editar:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
dau'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, lo cual es correcto.por lo que su problema debe estar en algún otro lugar, posiblemente si intenta hacer algo con él donde hay una conversión implícita (podría estar imprimiendo, escribiendo en una secuencia ...)
para decir más, necesitaremos ver un código.
fuente
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
es utf8-codificado. si lo imprime, simplemente conecta los bytes al flujo de salida, y si su terminal no lo interpreta como utf8, termina con basura. condecode
lo convierte a Unicode, luego puedeencode
volver a codificarlo con su terminal.Mi +1 al comentario de mata en https://stackoverflow.com/a/10561979/1346705 y a la demostración de Nick Craig-Wood. Ha decodificado la cadena correctamente. El problema está en el
print
comando, ya que convierte la cadena Unicode en la codificación de la consola y la consola no puede mostrar la cadena. Intente escribir la cadena en un archivo y observe el resultado con un editor decente que admita Unicode:Entonces lo verás
(。・ω・。)ノ
.fuente
Si está trabajando en un host remoto , mire en
/etc/ssh/ssh_config
su PC local .Cuando este archivo contiene una línea:
coméntelo agregando
#
al comienzo de la línea. Podría ayudar.Con esta línea,
ssh
envía variables de entorno relacionadas con el idioma de su PC al host remoto . Causa muchos problemas.fuente
Intente configurar la codificación predeterminada del sistema como
utf-8
al comienzo del script, de modo que todas las cadenas se codifiquen con eso.fuente
Está bien usar el siguiente código en la parte superior de su script como sugirió Andrei Krasutski .
Pero te sugiero que también agregues
# -*- coding: utf-8 -*
línea en la parte superior del guión.Omitirlo arroja el siguiente error en mi caso cuando intento ejecutar
basic.py
.El siguiente es el código presente en
basic.py
que arroja el error anterior.código con error
Entonces agregué
# -*- coding: utf-8 -*-
línea en la parte superior y ejecuté. Funcionó.código sin error
Gracias.
fuente
#coding: utf-8
lugar de# -*- coding: utf-8 -*-
esto es más fácil de recordar. Funciona de inmediato con Python PEP 263 - Definición de codificaciones de código fuente de Python .No hay problemas con mi terminal. Las respuestas anteriores me ayudaron a buscar en las direcciones correctas, pero no me funcionó hasta que agregué
'ignore'
:Como se indica en el comentario a continuación, esto puede dar lugar a resultados no deseados. OTOH también puede hacer el truco lo suficientemente bien como para que las cosas funcionen y no te preocupes por perder algunos personajes.
fuente
esto funciona para ubuntu 15.10:
fuente
Parece que su cadena está codificada
utf-8
, entonces, ¿cuál es exactamente el problema? ¿O qué intentas hacer aquí ...?fuente
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, quiero que se codifique correctamente.En mi caso, fue causado porque mi archivo Unicode se guardó con una "BOM". Para resolver esto, abrí el archivo usando BBEdit e hice un "Guardar como ..." eligiendo para codificar "Unicode (UTF-8)" y no lo que venía con "Unicode (UTF-8, con BOM)" "
fuente
Recibí el mismo tipo de error y descubrí que la consola no es capaz de mostrar la cadena en otro idioma. Por lo tanto, hice los siguientes cambios en el código para establecer default_charset como UTF-8.
fuente
Esta es la mejor respuesta: https://stackoverflow.com/a/4027726/2159089
en linux:
también
sys.stdout.encoding
está bien.fuente
BOM, a menudo es BOM para mí
vi el archivo, use
y guárdalo. Eso casi siempre lo arregla en mi caso
fuente
Tuve el mismo error, con URL que contienen caracteres no ascii (bytes con valores> 128)
Funcionó para mí, en Python 2.7, supongo que esta asignación cambió 'algo' en la
str
representación interna, es decir, fuerza la decodificación correcta de la secuencia de bytes respaldadaurl
y finalmente coloca la cadena en un utf-8str
con toda la magia en el lugar correcto. Unicode en Python es magia negra para mí. Espero útilfuente
resuelvo ese problema cambiando en el archivo settings.py con 'ENGINE': 'django.db.backends.mysql', no use 'ENGINE': 'mysql.connector.django',
fuente
Simplemente convierta el texto explícitamente en cadena usando
str()
. Trabajó para mi.fuente