Usted preguntó (en un comentario) "" "Eso es lo que me desconcierta ¿Cómo ha ido de ella original, acentuada a lo que es ahora Cuando dices doble codificación con UTF-8? y latin1, ¿eso es un total de 3 codificaciones (2 utf8 + 1 latin1)? ¿Cuál es el orden de la codificación del estado original al actual? "" "
En la respuesta de Mark Byers, él dice" "" lo que parece ser una codificación UTF-8 que se ha decodificado incorrectamente "" ". Usted ha aceptado su respuesta. ¿Pero todavía estás desconcertado? Bien, aquí está la descripción paso a paso:
Nota: Todas las cadenas se mostrarán usando (implícitamente) repr()
. unicodedata.name()
se usará para verificar los contenidos. De esta forma, las variaciones en la codificación de la consola no pueden confundir la interpretación de las cadenas.
Estado inicial: tiene un objeto Unicode que ha llamado u1. Contiene e-aguda:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
codificar u1 como UTF-8 y el nombre el resultado s:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
a descifrar s utilizando latin1 - incorrecta; s fue codificado usando utf8, NO latin1. El resultado es basura sin sentido.
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
Por favor, comprenda: unicode_object.encode('x').decode('y)
cuando x = y es normalmente [ver nota siguiente] un disparate; levantará una excepción si tienes suerte; si no tiene suerte, creará en silencio un galimatías. También comprenda que crear silenciosamente un galimatías no es un error; no hay una forma general en que Python (o cualquier otro idioma) pueda detectar que se haya cometido un sinsentido. Esto se aplica particularmente cuando se trata de latin1, porque los 256 puntos de código mapean 1 a 1 con los primeros 256 puntos de código Unicode, por lo que es imposible obtener un UnicodeDecodeError de str_object.decode ('latin1').
Por supuesto, anormalmente (uno espera que sea anormal) es posible que tenga que revertir tales tonterías haciendo gibberish_unicode_object.encode('y').decode('x')
como se sugiere en varias respuestas a su pregunta.
Esta es la TERCERA pregunta que ha hecho en menos de un día, basada en el mismo malentendido. 'u'Andr \ xc3 \ xa9'' es una tontería obtenida por una doble codificación con utf8 y latin1. ¡Simplemente no hagas eso! –
Eso es lo que me desconcierta. ¿Cómo pasó de acento original a lo que es ahora? Cuando dices doble codificación con utf8 y latin1, ¿hay un total de 3 codificaciones (2 utf8 + 1 latin1)? ¿Cuál es el orden de la codificación desde el estado original hasta el actual? –