5

Ho un testo che contiene caratteri come "\ xaf", "\ xbe", che, come ho capito da this question, sono caratteri codificati ASCII.Come convertire i caratteri codificati xXY in UTF-8 in Python?

Voglio convertirli in Python ai loro equivalenti UTF-8. Il solito string.encode("utf-8") genera UnicodeDecodeError. C'è un modo migliore, ad esempio, con la libreria standard codecs?

Esempio 200 characters here.

+0

tuo campione non include alcun '\ xaf' o il simile. Hai qualche campione con tali personaggi? – dkarp

+0

I dati di esempio * sono * UTF-8 valido. Con i caratteri di controllo "separatore di record" e "separatore di unità". – dan04

+0

Secondo 'enca' (http://linux.die.net/man/1/enca) è UTF-8" circondato da/intermixato con dati non di testo ". –

risposta

2

Il file è già un file con codifica 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)) 

E manualmente compilando i nomi sconosciuti:
char U000a LINE FEED
char INFORMAZIONI U001e SEPARATORE DUE
char INFORMAZIONI U001f separatore di un

+0

Grazie, hai ragione il breve campione che ho fornito è UTF-8. tuttavia (sfortunatamente) nell'intero file, ci sono parti codificate in varie altre codifiche (principalmente windows-1250). Ho risolto questo problema con 'try'ing to' "string".decode() 'per le codifiche più comuni e, se tutto fallisce, indovinando la codifica con la libreria' chardet'. –

2

Non è ASCII (i codici ASCII vanno solo fino a 127; \xaf è 175). Per prima cosa è necessario trovare la codifica corretta, decodificarla e quindi ricodificarla in UTF-8.

Potrebbe fornire un campione di stringa effettivo? Quindi possiamo probabilmente indovinare la codifica corrente.

+0

Ho modificato la domanda per aggiungere un collegamento a un breve campione. –

+0

Quell'esempio non mi sembra un testo codificato, più simile a un formato proprietario. –

+0

Dovrebbe essere nel formato MARC (http://www.loc.gov/marc/). Quando ho provato a rilevare la sua codifica con 'enca' ho ricevuto una risposta dicendo che è principalmente UTF-8 intervallato da caratteri non di testo. –

3

.encode è per convertire una stringa Unicode (unicode in 2.x, str in 3.x) per una una stringa di byte (str in 2.x, bytes in 3.x).

In 2.x, è legale chiamare .encode su un oggetto str. Python decodifica implicitamente la stringa in Unicode: s.encode(e) funziona come se fosse stato scritto s.decode(sys.getdefaultencoding()).encode(e).

Il problema è che la codifica predefinita è "ascii" e la stringa contiene caratteri non ASCII. Puoi risolvere questo problema specificando esplicitamente la codifica corretta.

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

Va bene, ma il resto del testo è codificato come UTF-8 (almeno questo è stato segnalato da 'enca'). Quindi questa procedura non può essere applicata per l'intero testo. –

+2

Quindi i caratteri \ xXY sono in ISO-8859-1? –