Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMLReader未清除多字节UTF-8编码属性_Java_Utf 8_Character Encoding_Sax_Xmlreader - Fatal编程技术网

Java XMLReader未清除多字节UTF-8编码属性

Java XMLReader未清除多字节UTF-8编码属性,java,utf-8,character-encoding,sax,xmlreader,Java,Utf 8,Character Encoding,Sax,Xmlreader,我遇到了一个非常奇怪的情况,我的SAX ContentHandler被XMLReader传递坏属性。正在解析的文档是UTF-8,XML属性中包含多字节字符。似乎每次调用我的处理程序时都会累积这些属性。因此,它们不是连续传递,而是连接到前一个节点的值上 下面是一个使用公共数据(Wikipedia)演示这一点的示例 更新:这个完整的示例产生了以下内容(对于粗俗的输出,向所有说粤语的人道歉): 似乎是包含JRE的Xerces版本(com.sun.org.apache.Xerces.internal.p

我遇到了一个非常奇怪的情况,我的SAX ContentHandler被XMLReader传递坏属性。正在解析的文档是UTF-8,XML属性中包含多字节字符。似乎每次调用我的处理程序时都会累积这些属性。因此,它们不是连续传递,而是连接到前一个节点的值上

下面是一个使用公共数据(Wikipedia)演示这一点的示例

更新:这个完整的示例产生了以下内容(对于粗俗的输出,向所有说粤语的人道歉):


似乎是包含JRE的Xerces版本(
com.sun.org.apache.Xerces.internal.parsers.SAXParser
)中的一个bug。下面是我的笔记

与JRE 1.6.0_24捆绑在一起的版本确实积累了属性

Xerces-J似乎没有该缺陷

Xerces2-J,似乎没有该缺陷


从测试的版本可以看出,我正在将版本历史平分。似乎是什么。我有点惊讶JRE没有被更新,因为它是在大约7年前在主要Xerces中修复的

您使用的是标准的jdk sax impl,还是包含了自己的版本(如xerces)。除了标准jdk之外,我没有包含任何内容。调试看起来正在使用的实现是
com.sun.org.apache.xerces.internal.parsers.SAXParser
。能否显示显示显示此行为的输出?您确定第10个
上的title属性是所有10个title属性值的串联吗?奇怪的是,无论原始文档编码是否正确,SAX解析器都不应该串联值!在我看来,那里似乎有一只虫子。
public class MyContentHandler extends org.xml.sax.helpers.DefaultHandler {

    public static void main(String[] args) {
        try {
            org.xml.sax.XMLReader reader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
            reader.setContentHandler(new MyContentHandler());
            reader.parse("http://en.wikipedia.org/w/api.php?format=xml&action=query&list=allpages&apfilterredir=redirects&apdir=descending");

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) {
        if ("p".equals(qName)) {
            String title = attributes.getValue("title");
            System.out.println(title);
        }
    }
}