0

Webサービスで受信した文字列を次のようにドキュメント(DOM)xmlに変換しています。

Document file= null;
String xmlFile= "blablabla"; //latin1 encodeing

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
this.file = builder.parse(new InputSource(new StringReader(xmlFile)));

しかし、文字列はISO-8859-1(latin1)でエンコードされており、このドキュメントのノードを読み取ると、いくつかのエラーが発生します。ISO-8859-1エンコーディングを使用してDOMオブジェクトを正しく作成するにはどうすればよいですか?または文字列内のエンコーディングLatin 1を使用してノードを読み取るにはどうすればよいですか?

4

2 に答える 2

1

これを試して:

this.file = builder.parse(new ByteArrayInputStream(xmlFile.getBytes("ISO-8859-1")));
于 2012-06-20T15:13:57.500 に答える
0

序文

文字列は一連の文字 (Unicode 標準で定義された抽象エンティティ) を表すため、文字列にはエンコードがありません。

バイト シーケンスにはエンコーディングがあり、文字のシーケンスとして解釈される場合があります (java に解釈方法を指定する場合)。

あなたの問題

あなたの問題では、データは文字列に保存されます。したがって、すでに一連の文字として解釈されています。どうやら解釈が間違っていたようです。

問題とデータのエンコーディングを知る方法に応じて、2 つのオプションがあります。

解決策 1 (最適かもしれません):

受信したデータを解釈せず、バイト シーケンス (Stream または byte[] または ByteArray) として保持します。次に、この Byte シーケンスを DOM パーサーに直接渡します (マークアップが正しい場合は、エンコーディングに関係なく、xml ファイルを正しくデコードします。

解決策 2 (データの取得方法によっては、これが唯一可能な場合があります):

@ThOrndike の回答に記載されているように、String を ByteArray として再エンコードします。

this.file = builder.parse(new ByteArrayInputStream(xmlFile.getBytes("ISO-8859-1")));

これは、文字列が最初に正しく解釈されていることが確実な場合にのみ機能します。

どうやら、ここではそうではなく、文字列を提供するライブラリが既にそれを UTF-8 バイト シーケンスとして解釈しているようです (すべてのエラー バイトを「?」で置き換えます。これは UTF-8 リーダーの動作です)。 )。その場合、元のバイトが失われているため、何もできません。

あなたの唯一の希望は解決策1です。または、文字列を提供するライブラリにそれを正しく解釈させる方法を見つけてください。

于 2012-07-18T14:01:39.673 に答える