Domanda

Sto cercando di analizzare un file XML (dati OSM) con expat, e ci sono linee con alcuni caratteri Unicode che expat non può analizzare:

<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />

<tag k="name" v="Cin\x8e? Rex" />

(file di codifica XML nella linea di apertura è "UTF-8")

Il file è abbastanza vecchio, e ci deve essere stato errori. Nei file moderni non vedo UTF-8 errori, ed essi vengono analizzati bene. Ma cosa succede se il mio programma incontra un simbolo rotto, quello che soluzione posso fare? E 'possibile aderire codec bz2 (I analizzare un file compresso) e UTF-8 codec di ignorare i caratteri rotti, o di cambiare "?"?

È stato utile?

Soluzione

Non sono sicuro se '' i caratteri sono stati introdotti da stringa copia-incolla qui, ma se li avete nei dati originali, quindi sembra essere generatore problema che ha introdotto \ uFFFD charactes come:

"utilizzato per sostituire un carattere in ingresso il cui valore è sconosciuto o irrappresentabile in Unicode "

citied da: http://www.fileformat.info/info/unicode/char/ FFFD / index.htm

Per risolvere il problema? idea solo per l'estensione:

good = True
buf = None
while True:
if good:
        buf = f.read(buf_size)
        else:
        # try again with cleaned buffer
        pass
        try:
            xp.Parse(buf, len(buf) == 0)
            if (len(buf) == 0):
                    break
        good = True
    except ExpatError:
        if xp.ErrorCode  == XML_ERROR_BAD_CHAR_REF:
            # look at ErrorByteIndex (or nearby)
            # for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
            good = False
        else:
            # other errors processing
            pass

Or casi buffer di ingresso pulito invece + angolo (sequenza parziale alla fine del buffer). Non riesco a ricordare se expat di Python permette di assegnare gestore di errore personalizzato. Sarebbe più facile allora.

Se pulisco vostro campione dalla '' caratteri è trattato ok. \ Xd1 non fallisce.

i dati OSM?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top