0

アラビア文字の DOM 解析に問題があり、奇妙な文字が表示されました。別のエンコーディングに変更しようとしましたが、できませんでした。

完全なコードは次のリンクにあります: http://test11.host56.com/parser.java

public Document getDomElement(String xml) {
    Document doc = null;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   try {
       Reader reader = new InputStreamReader(new ByteArrayInputStream(
       xml.getBytes("UTF-8")));
       InputSource is = new InputSource(reader);

       DocumentBuilder db = dbf.newDocumentBuilder();

       //InputSource is = new InputSource();
       is.setCharacterStream(new StringReader(xml));
       doc = db.parse(is);

       return doc;
   }
}

私のxmlファイル

<?xml version="1.0" encoding="UTF-8"?>
<music>
<song>
    <id>1</id>    
    <title>اهلا وسهلا</title>
    <artist>بكم</artist>
    <duration>4:47</duration>
    <thumb_url>http://wtever.png</thumb_url>
</song>
</music>
4

2 に答える 2

1

既に xml を持っているStringので、その文字列に既に奇妙な文字が含まれていない限り (つまり、間違ったエンコーディングで読み込まれた場合)、代わりに StringReader を使用することで、ここでエンコーディングの狂気を避けることができます。たとえば、次の代わりに:

Reader reader = new InputStreamReader(new ByteArrayInputStream(
   xml.getBytes("UTF-8")));

使用する:

Reader reader = new StringReader(xml);

編集:コードの詳細が表示されたので、XML が解析される前にエンコードの問題が既に発生しているようです。その部分には次が含まれているためです。

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);

のjavadocには次のように書かれていEntityUtils.toStringます:

コンテンツは、エンティティ (存在する場合) の文字セットを使用して変換されますが、失敗すると、「ISO-8859-1」が使用されます。

サーバーがエンティティで適切なエンコーディング情報を送信していないようで、HttpUtils は UTF-8 ではないデフォルトを使用しています。

修正: 明示的なデフォルト エンコーディングを使用するバリアントを使用します。

xml = EntityUtils.toString(httpEntity, "utf-8");

ここでは、サーバーが UTF-8 を送信すると仮定します。サーバーが別のエンコーディングを使用している場合は、UTF-8 の代わりにそのエンコーディングを設定する必要があります。(しかし、XML も宣言しているように、encoding="UTF-8"私はこれが事実だと思いました。) サーバーが使用するエンコーディングが不明な場合は、勝手な推測に頼るしかなく、運が悪くなります。

于 2013-02-09T21:37:33.303 に答える