質問

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

DocumentBuilder.parse(ByteArrayInputStream bais) 

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

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

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

役に立ちましたか?

解決

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

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));

他のヒント

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top