4

当社のプロバイダーの 1 つは、UTF-8 でエンコードされたドキュメントとしてタグ付けされているが、UTF-8 文字セットに含まれていない文字を含む XML フィードを送信することがあります。これにより、パーサーは例外をスローし、これらの文字が検出されたときに DOM オブジェクトの構築を停止します。

DocumentBuilder.parse(ByteArrayInputStream bais) 

次の例外をスローします。

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.

これらの問題を早期に「キャプチャ」し、例外を回避する方法はありますか (つまり、これらの文字を見つけてストリームから削除するなど)? 私が探しているのは、誤ってエンコードされたドキュメントの「ベスト エフォート」タイプのフォールバックです。正しい解決策は明らかに、問題の発生源を攻撃し、正しいドキュメントのみが配信されるようにすることですが、それが不可能な場合の適切なアプローチは何でしょうか?

4

3 に答える 3

4

問題が本当に間違ったエンコーディング (混合エンコーディングではなく) である場合は、ドキュメントを再エンコードして解析する必要はありません。InputStream ではなく Reader として解析するだけで、dom パーサーはヘッダーを無視します。

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));
于 2008-10-19T23:31:55.663 に答える
2

無効なドキュメントを手動で調べて、それらに共通の問題が何であるかを確認する必要があります。実際には別のエンコーディング (ほとんどの場合 windows-1252) である可能性が非常に高く、その場合の最善の解決策は、壊れたシステムからすべてのドキュメントを取得し、解析する前に UTF-8 に再コード化することです。

別の考えられる原因は、エンコーディングが混在している (一部の要素のコンテンツが 1 つのエンコーディングにあり、他の要素のコンテンツが別のエンコーディングにある) ことです。それを修正するのは難しいでしょう。

また、回避策の使用を停止できるように、壊れたシステムがいつ修正されるかを知る方法も必要です。

于 2008-10-19T20:49:19.657 に答える
0

正しいUTF-8を送信するように指示する必要があります。いずれかのソリューションで失敗した場合、不良文字を有効なUTF-8として再エンコードしてから、パーサーに渡します。この理由は、不良文字が保持されている場合、異なるプログラムが出力を異なる方法で解釈する可能性があり、セキュリティホールにつながる可能性があるためです。

于 2008-10-20T01:23:04.207 に答える