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 as 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);

的 javadocEntityUtils.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 回答
0

如果 XML 包含 Unicode 字符,例如阿拉伯或波斯字母,StringReader则会例外。在这些情况下,InputStream直接将 传递给Document对象。

于 2014-09-30T08:40:11.203 回答