Pregunta

¿Alguna idea de por qué esto no está funcionando? Realmente pensé 'ignorar' haría lo correcto.

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
¿Fue útil?

Solución

... hay una razón que se llaman "codificaciones" ...

Un poco de preámbulo: pensar en Unicode como la norma, o el estado ideal. Unicode es sólo una tabla de caracteres. №65 es el capital latino A. №937 es griega omega mayúscula. Sólo eso.

Para que un ordenador para almacenar y manipular o Unicode, tiene que codificar en bytes. El más sencillo codificación de Unicode es UCS-4; cada carácter ocupa 4 bytes, y todos ~ 1000000 caracteres están disponibles. Los 4 bytes contienen el número del carácter en las tablas Unicode como un entero de 4 bytes. Otra codificación muy útil es UTF-8, que puede codificar cualquier carácter Unicode con uno a cuatro bytes. Pero también hay algunas codificaciones limitados, como "latin1", que incluyen un rango muy limitado de caracteres, utilizado sobre todo por los países occidentales. Tales codificaciones utilizar un único byte por carácter.

Básicamente, Unicode puede ser codificado con muchos sistemas de codificación y cadenas codificadas puede ser decodificada a Unicode. La cosa es, Unicode llegó bastante tarde, por lo que todos nosotros que creció el uso de un 8 bits conjunto de caracteres aprendieron demasiado tarde de que todo este tiempo hemos trabajado con codificadas cuerdas. La codificación podría ser ISO8859-1 o ventanas CP437 o CP850, o, o, o, dependiendo de nuestra defecto del sistema.

Así que cuando, en el código fuente, se introduce la cadena "añadir‘Monitoreo’a la lista" (y creo que quería la cadena "ADD‘Monitoreo’a la lista", tenga en cuenta la segunda cita), en realidad se está utilizando una cadena ya codificado de acuerdo con la página de códigos por omisión del sistema (por el byte \ x93 asumo que utiliza Windows página de códigos 1252, “occidental”). Si desea obtener Unicode de eso, usted necesita decodificación de la cadena a partir de la codificación "CP1252".

Por lo tanto, lo que quería hacer, era:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

Es desafortunado que Python 2.x incluye un método para cuerdas .encode también; esta es una función de conveniencia para codificaciones "especiales", como el "zip" o "rot13" o unos "base64", que no tienen nada que ver con Unicode.

De todos modos, todo lo que tiene que recordar para que su vaivén conversiones Unicode es:

  • una cadena Unicode se pone codificado a una cadena Python 2.x (en realidad, una secuencia de bytes)
  • una cadena Python 2.x obtiene decodificada a una cadena Unicode

En ambos casos, es necesario especificar el codificación que se utilizará.

No soy muy claro, tengo sueño, pero estoy seguro que espero que ayude.

PS Una nota de humor: mayas no tenían Unicode; antiguos romanos, griegos antiguos, antiguos egipcios no lo hicieron también. Todos ellos tenían sus propias "codificaciones", y tenía poco o ningún respeto por otras culturas. Todas estas civilizaciones desmoronaron. Piense en ella la gente! Hacer que sus aplicaciones compatibles con Unicode, por el bien de la humanidad. :)

PS2 Por favor, no echar a perder el mensaje anterior diciendo "Pero los chinos ...". Si usted se siente inclinado o está obligado a hacerlo, sin embargo, retrasarlo por pensar que el Unicode BMP está poblada principalmente por los ideogramas chinos, ergo china es la base de Unicode. Puedo seguir inventando mentiras, siempre y cuando las personas desarrollan aplicaciones compatibles con Unicode. Saludos!

Otros consejos

codifican está disponible para cadenas Unicode, pero la cadena que tiene allí no parece Unicode (tratar con u'add \ x93Monitoring \ x93 a la lista ')

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '

Esto parece funcionar:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')

Cualquier problema con eso? Me pregunto cuándo 'ignorar', 'reemplazar' y otra como la gestión de errores de codificación viene en?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top