4

SAX は、次の例外で停止し続けます。

Invalid byte 2 of 3-byte UTF-8 sequence

問題は、ほとんど正しく UTF-8 でエンコードされていることですが、いくつかのエラーがあります。ファイルの新しいバージョンを取得できません。このファイルを使用する必要があります。

では、SAX に無効な文字シーケンスを無視するように、または UTF-8 ファイルをクリーンアップして無効な UTF-8 シーケンスが含まれないようにするにはどうすればよいでしょうか。

4

5 に答える 5

3

SAX がストリームを読み取る前に、ストリームをフィルタリングできます。ストリームを読み取り、無効な文字をドロップする InputStream を作成します。

于 2009-10-19T06:02:41.167 に答える
2

ファイルを XML として解析するのとはまったく別の手順として、ファイルをクリーンアップすることをお勧めします。

UTF-8 は非常に理解しやすいエンコーディングです。この Web ページは、UTF-8 がどのように形成されることを意図しているかを示しています。入力ファイルを読み込んで新しいファイルを書き出すプログラムを作成することをお勧めします。バイトごとに読み取り、有効に形成されていることを確認した場合にのみ文字を書き出します。無効なバイトが検出されると、文字列「UTF8ERROR」または入力データでは自然に発生しない他の簡単に見つけられるトークンが書き出されます。その後、残りの文字をスキップします。

その後、エラーが発生した場所を確認してデータを修正し、通常どおり解析できます。

このようにして、エラーがどの程度広がっているかを確認し、エラーに何らかのパターンがあるかどうかを確認し、潜在的にエラーを修正できるようにします。同じソースからより多くのデータを受け取る予定がある場合は、その問題について彼らに話すことを強くお勧めします...それは彼らの側でより深刻な問題を示している可能性があります.

于 2009-10-19T06:06:43.653 に答える
0

これはあまり役に立たないと思いますが、おそらく他の人が知りたいと思うでしょう:

最近、ISO-8859-1ヘッダーで提供されたUTF-8XMLファイルを取得するときに同じ例外が発生しました。解決策は、String.getBytes(charset)を介してUTF-8を手動で指定することでした。

public Document parseRequest(HttpServletRequest request) {
   DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance();

   DataInputStream dataStream = new DataInputStream(request.getInputStream());
   String xml = dataStream.readUTF();
   ByteArrayInputStream byteStream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
   return builder.newDocumentBuilder().parse(byteStream);
}

編集:..またはさらに簡単:

public Document parseRequest(HttpServletRequest request) {
   DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

   Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8");
   InputSource source = new InputSource(reader);
   return domFactory.newDocumentBuilder().parse(source);
}
于 2009-11-04T14:36:48.517 に答える
0

何とか 併用java.nio.charset.CharsetDecoderしていただけないでしょうか?InputStreamReader(InputStream in, CharsetDecoder dec)

デコード エラーがどのように処理されるかは、CodingErrorAction クラスのインスタンスによって記述される、そのタイプのエラーに対して要求されるアクションによって異なります。考えられるエラー アクションは、誤った入力を無視するか、返された CoderResult オブジェクトを介して呼び出し元にエラーを報告するか、または誤った入力を置換文字列の現在の値に置き換えることです。置換の初期値は「\uFFFD」です。その値は replaceWith メソッドで変更できます。

( CharsetDecoderjavadoc から)

于 2009-11-06T08:31:37.687 に答える