0

XML ファイル (OSM データ) を expat で解析しようとしていますが、expat で解析できない Unicode 文字を含む行があります。

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

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

(XMLファイルの冒頭行のエンコードは「UTF-8」)

ファイルがかなり古いため、エラーが発生した可能性があります。最新のファイルでは、UTF-8 エラーは表示されず、正常に解析されます。しかし、私のプログラムが壊れたシンボルに遭遇した場合、どのような回避策を講じることができますか? bz2 コーデック (圧縮ファイルを解析します) と utf-8 コーデックを結合して、壊れた文字を無視するか、「?」に変更することはできますか?

4

1 に答える 1

1

ここで文字列をコピーして貼り付けることによって「�」文字が導入されたかどうかはわかりませんが、元のデータにそれらがある場合、 \uFFFD 文字を次のように導入したジェネレーターの問題のようです。

「値が不明またはUnicodeで表現できない着信文字を置き換えるために使用されます」

引用元: http://www.fileformat.info/info/unicode/char/fffd/index.htm

回避策 拡張のアイデア:

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

または、代わりに入力バッファをクリーンアップ + コーナー ケース (バッファ エンドの部分シーケンス)。Python の expat でカスタム エラー ハンドラの割り当てが許可されているかどうか思い出せません。それならもっと簡単でしょう。

あなたのサンプルから「�」文字を消去すると、問題なく処理されます。\xd1 は失敗しません。

OSMデータ?

于 2010-03-23T01:17:05.650 に答える