Frage

Ich versuche, eine XML-Datei (OSM-Daten) mit Expat zu analysieren, und es gibt Zeilen mit einigen Unicode-Zeichen, dass Expat kann nicht analysieren:

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

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

(XML-Datei-Codierung in der ersten Zeile ist "UTF-8")

Die Datei ist ziemlich alt, und es müssen Fehler gewesen sein. In modernen Dateien sehe ich nicht UTF-8 Fehler, und sie sind geparsten in Ordnung. Aber was, wenn mein Programm ein gebrochenes Symbol trifft, welche Abhilfe kann ich machen? Ist es möglich, verbinden bz2 Codec (ich eine komprimierte Datei parsen) und utf-8-Codec die gebrochenen Zeichen zu ignorieren, oder sie ändern zu „?“?

War es hilfreich?

Lösung

Nicht sicher, ob ‚‘ Zeichen von copy-Einfügen-String eingeführt wurden hier, aber wenn man sie in Originaldaten hat, dann scheint es, Generator zu sein Problem, das \ uFFFD charactes eingeführt wie:

"verwendet, um einen eingehenden Zeichen, dessen Wert zu ersetzen, ist nicht bekannt, oder unrepresentable in Unicode "

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

Abhilfe? Nur Idee für die Erweiterung:

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

oder saubere Eingangspuffer statt + Eckfällen (Teilsequenz am Pufferende). Ich kann mich nicht erinnern, ob Python Expat ermöglicht assign eine benutzerdefinierte Fehlerbehandlung. Das wäre dann leichter.

Wenn ich sauber Ihre Probe von ‚‘ Zeichen ist es ok verarbeitet. \ Xd1 nicht fehlschlagen.

OSM-Daten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top