5

さまざまな XML ファイルを解析する必要がある Android 用のアプリを開発しています。それらのほとんどは UTF-8 でエンコードされていますが、いくつかは ISO-8859-1 でエンコードされている場合があります。

  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  ...
  in = con.getInputStream();
  InputSource is = new InputSource(in);
  ...
  parser.parse(is, handler);

入力を処理するための私のコードは上記のようになります。javaドキュメントには、次のことが記載されていInputSourceます。

文字ストリームは存在しないがバイト ストリームは存在する場合、パーサーはそのバイト ストリームを使用し、InputSource で指定されたエンコーディングを使用するか、(エンコーディングが指定されていない場合) のようなアルゴリズムを使用して文字エンコーディングを自動検出します。 XML 仕様。

を渡してByteStreamいますが、エンコーディングを指定していないため、ドキュメントによると、エンコーディングは自動検出されるはずです。しかし、そうではありません。UTF-8 でエンコードされたすべてのファイルは問題ありませんが、ISO-8859-1 のファイルはそうではありません ( Parser Expat... Exception for some invalid characters. 手動でエンコーディングInputSourceを「ISO-8859-1」に設定すると、逆の動作になります。

どうすればこれを解決できますか? Google とStackoverflow何時間も検索しましたが、解決策が見つかりませんでした。CharacterStreamにも aを渡そうとしましたInputSourceが、ISO-8859-1 ファイルの一部の文字(äöüÄÖÜß)はまだ「?」として表示されます。私のアプリで。

前もって感謝します!

4

4 に答える 4

1

最適な解決策は、問題の正確な原因によって異なります。HTTP 経由で XML ドキュメントを取得する場合、エンコードは Content-Type 応答ヘッダーでも指定される場合があり、必ずしも XML ドキュメント自体で指定されるとは限りません。new InputSource("http://...");その場合、Android の XML ライブラリが正しく実装されている場合 (Content+Type ヘッダーが評価されているかどうかをここで確認する方法はありません)、代わりに URL を使用して直接 InputSource を作成できるはずです。

エンコーディングが HTTP ヘッダーで設定されておらず、XML プロローグで指定されていない場合、パーサーは UTF-8 エンコーディング (XML 仕様で義務付けられている) を想定していれば正しく動作します。ドキュメントに記載されている自動検出は、パーサーが実際にドキュメント コンテンツを調べてエンコーディングを推測することを意味するのではなく、XML ストリームのエンコーディング属性をチェックすることを意味します。encoding 属性がない場合、デフォルトで UTF-8 になります。

于 2012-12-13T12:32:48.110 に答える
1

古いASCIIセットにない文字があるかどうかを確認し、UTF-8文字があると思われる場合は文字列を再エンコードすることをお勧めします:

String output=new String(input.getBytes("8859_1"), "utf-8");

その行は ISO-8859-1 を取り、それを Java で使用される utf-8 に変換します。

于 2012-12-13T11:45:21.250 に答える
0

最も簡単な方法は、UTF-8 を使用することです。無効なバイトのパーサー例外がスローされた場合は、Windows-1252 として再解析を試みます。1252 というのは、ISO-8859-1 C1 文字を使用している人がいるとは思えないからです。Windows 1252 文字を使用している人を見て、それが常に ISO-8859-1 であると主張しているからです。

于 2012-12-13T11:13:08.400 に答える
-1

エンコーディングについては SAX に決定させることをお勧めします。SAX は XML 宣言のエンコーディング属性から判断します。

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

注: 正当な xml 宣言がない場合、エンコーディングは UTF-8 と見なされます。

例のようにバイトストリームInputSourceを使用し、InputStreamエンコーディングを明示的に設定しない場合、SAXはXMLからエンコーディングを取得します

アップデート

このテストを試してください。iso-8859-1 の 1.xml ファイルに xml 文字列を書き込みます。次に、SAX はそれを解析し、ルート要素のテキストを出力します (これは 'ä' の 1 文字のみです)。SAX は、1.xmk が iso-8859-1 を使用することを理解する必要があります。そうしないと、出力が歪んでしまいます。

String xml = "<?xml version='1.0' encoding='iso-8859-1'?><root>ä</root>";
OutputStreamWriter wrt = new OutputStreamWriter(new FileOutputStream(
        "1.xml"), "iso-8859-1");
wrt.write(xml);
wrt.close();
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser p = sf.newSAXParser();
p.parse(new FileInputStream("1.xml"), new DefaultHandler() {
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println((int)ch[start]);
        System.out.println(String.valueOf(ch, start, length));
    }
});

出力を見る

228
ä

正しいです。SAX は、XML エンコーディング = 'iso-8859-1' を理解しています。

于 2012-12-13T11:24:32.833 に答える