5

Tengo un texto que contiene caracteres como "\ xaf", "\ xbe", que, como lo entiendo desde this question, son caracteres codificados en ASCII.Cómo convertir caracteres codificados xXY a UTF-8 en Python?

Quiero convertirlos en Python a sus equivalentes UTF-8. El string.encode("utf-8") habitual arroja UnicodeDecodeError. ¿Hay alguna forma mejor, por ejemplo, con la biblioteca estándar codecs?

Muestra 200 characters here.

+0

Su muestra no incluye ninguna '\ xaf' o similares. ¿Tienes alguna muestra con tales personajes? – dkarp

+0

Sus datos de muestra * son * UTF-8 válidos. Con los caracteres de control "separador de registro" y "separador de unidad". – dan04

+0

Según 'enca' (http://linux.die.net/man/1/enca) es UTF-8" rodeado por/entremezclado con datos que no son de texto ". –

Respuesta

2

Su archivo ya está codificado en UTF-8.

# saved encoding-sample to /tmp/encoding-sample 
import codecs 
fp= codecs.open("/tmp/encoding-sample", "r", "utf8") 
data= fp.read() 

import unicodedata as ud 

chars= sorted(set(data)) 
for char in chars: 
    try: 
     charname= ud.name(char) 
    except ValueError: 
     charname= "<unknown>" 
    sys.stdout.write("char U%04x %s\n" % (ord(char), charname)) 

Y manualmente llenando los nombres desconocidos:
carbón ALIMENTACIÓN DE LÍNEA u000A
carbón INFORMACIÓN U001e SEPARADOR DE DOS
carbón INFORMACIÓN U001f SEPARADOR DE UNA

+0

Gracias, tienes razón, la muestra corta que he proporcionado es UTF-8. sin embargo (desafortunadamente) en todo el archivo, hay partes codificadas en varias otras codificaciones (principalmente windows-1250). He resuelto esto por 'try'ing to' "string".decode() 'para las codificaciones más comunes y, si todo falló, adivinando la codificación con la biblioteca' chardet'. –

2

No es ASCII (los códigos ASCII solo suben a 127; \xaf es 175). Primero necesita averiguar la codificación correcta, decodificar eso y luego volver a codificar en UTF-8.

¿Podría proporcionar una muestra de cadena real? Entonces probablemente podamos adivinar la codificación actual.

+0

He editado la pregunta para agregar un enlace a una muestra corta. –

+0

Esa muestra no se parece a un texto codificado para mí, más como un formato propietario. –

+0

Debe estar en el formato MARC (http://www.loc.gov/marc/). Cuando traté de detectar su codificación con 'enca' recibí una respuesta que decía que se trataba principalmente de UTF-8 intercalado con caracteres que no eran de texto. –

3

.encode es para convertir una cadena Unicode (unicode en 2.x, str en 3.x) a una una cadena de bytes (str en 2.x, bytes en 3.x).

En 2.x, es legal llamar al .encode en un objeto str. Python descifra implícitamente la cadena a Unicode primero: s.encode(e) funciona como si hubiera escrito s.decode(sys.getdefaultencoding()).encode(e).

El problema es que la codificación predeterminada es "ascii" y la cadena contiene caracteres que no son ASCII. Puede resolver esto especificando explícitamente la codificación correcta.

>>> '\xAF \xBE'.decode('ISO-8859-1').encode('UTF-8') 
'\xc2\xaf \xc2\xbe' 
+0

Eso está bien, pero el resto del texto está codificado como UTF-8 (al menos esto fue informado por 'enca'). Por lo tanto, este procedimiento no se puede aplicar para todo el texto. –

+2

¿Entonces los caracteres \ xXY están en ISO-8859-1? –

Cuestiones relacionadas