编码问题

时间:2010-01-02 13:40:01

标签: java xml encoding sax

我必须解析从网络上获得的内容,它可以包含特殊字符。在这种情况下,内容字符串如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

当上面的contet传递给方法characters()时,在从org.xml.sax.helpers.DefaultHandler扩展的类中:

public class ProductsXMLHandler extends DefaultHandler {
...

@Override    
public void characters(char[] ch, int start, int length)
            throws SAXException {
        String elementValue = new String(ch, start, length);
    ...
}

我注意到数组test &#382; test分为三个数组:'test','&#382;'和'test' 所以elementValue不等于test &#382; test,它应该是结果。有谁知道如何解决这个问题?

是否有必要重新编码源字符串:

 <?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

在传递给XML处理程序类之前?

谢谢!

3 个答案:

答案 0 :(得分:3)

作为J on Skeet said in in answercharacters被多次调用。你应该做的是以下几点:

  • startTag中,创建一个StringBuffer,并注意(例如,在一个布尔值中),如果你在正在搜索的正确标签中。
  • characters中,如果你在正确的标签中(如果之前的布尔值设置为真),则将字符放在StringBuffer中
  • endTag中,如果你没有使用正确的标签(参见boolean,与之前相同),请取出StringBuffer的内容并vo!这是你的完整字符串。在此之后不要忘记清空StringBuffer。

答案 1 :(得分:2)

你的意思是characters被召唤三次?如果是这样,你只需要让你的代码处理 - 解析器完全可以自由地执行此操作。您不应该假设您将在一次通话中获得所有角色数据。

来自DocumentHandler.characters()的文档:

  

SAX解析器可能会返回所有连续的   单个块中的字符数据,或   他们可能把它分成几个块;   但是,任何人物中的所有人物   单一事件必须来自同一事件   外部实体,使定位器   提供有用的信息。

答案 2 :(得分:2)

我不认为你可以做任何事情,这是根据SAX API。具体来说,来自http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

  

Parser会调用此方法   报告每个字符数据块。   SAX解析器可能会返回所有连续的   单个块中的字符数据,或   他们可能将它分成几个   块;但是,所有的   任何单个事件中的字符必须   来自同一个外部实体   Locator提供了有用的功能   信息。

(我的重点)