2

私の XML 入力ファイルには、次の行があります。

<change beforeWhat="Literacy rate in L2: 50\%–75\%. Informally used" />

との間の文字は、ハイフン50\%75\%はなくダッシュです。

Python で expat を使用してこの XML ファイルを解析すると、次のようになります。

postFixesDoc = minidom.parse('postFixes.xml')

次のエラーが表示されます。

ExpatError: not well-formed (invalid token): line 35, column 99             

ここで、35 は上記の XML 入力ファイルから引用した行で、99 は%en ダッシュの直前の列です。

en ダッシュを に置き換えると&#x2013;、エラーはなくなり、すべて正常に動作します。だから私は回避策を持っています。しかし、なぜこれが起こっているのかわかりません。

この問題について私が読んだ内容 (Python のミニダム、xml、および違法な Unicode 文字など) は、UTF-8 で有効な一部の文字が XML では有効でないことを示しており、XML のセクション 2.2 を示しています。有効な文字範囲の仕様。しかし、そこでの Char の定義には range が含まれています#x20-#xD7FF。そして、#x2013明らかにその範囲内に収まります。だから問題は何ですか?

FWIW、XML 入力ファイルは UTF-8 宣言で始まり、

<?xml version="1.0" encoding="utf8"?>

そして、16 進エディタを使用して、en ダッシュが文字シーケンス E2 80 93 で表されていることを確認しました。これは、en ダッシュの正しい UTF-8 エンコーディングです。では、なぜ外国人はそれを受け入れないのでしょうか? これはexpatのバグですか?

4

2 に答える 2

5

あはは…

この Python doc footnoteは、別の状況に適用されますが、XML エンコーディング宣言が間違っているという事実を警告してくれました。

XML 出力に含まれるエンコード文字列は、適切な標準に準拠する必要があります。たとえば、「UTF-8」は有効ですが、「UTF8」は無効です。

utf8どういうわけか、それも受け入れられるという印象を受けました。しかし、宣言を次のように変更したとき

<?xml version="1.0" encoding="utf-8"?>

エラーが消えました!

于 2013-12-11T17:57:34.253 に答える
1

エンコーディングを修正してよかったです!一般に、エンコーディングの問題で役立つトリックは、すべての非ASCII文字を数字参照に変換することです(試した「–」など)。それが修正された場合、問題はほぼ確実にエンコーディング レベルにあり、その時点で、データが実際に UCS-2、UTF-8、CP1252 であるかどうかを判断し始めます (CP1252 は、curly-quotes および em/en の一般的な問題です)ダッシュ、幸いなことに、あなたはそれに噛まれませんでした)。

*nix の「iconv」ユーティリティは、無数の文字エンコーディング間で変換できます。データを(たとえば)utf8からucs2に変換するように依頼すると、無効なバイトシーケンスについて叫びます。

XML にはもう 1 つ複雑な問題があります。多くの制御文字 (CR、LF、および HT 以外の d00 から d31) は厳密に許可されていません。しかし、その価値のある XML パーサーは、それらを見れば教えてくれます。

于 2013-12-11T18:26:07.247 に答える