我有一个XMLEventReader。它是用“UTF8”编码从XMLInputFactory构建的。我用它来读取一个XML文件,其“encoding”属性设置为“UTF-8”。
reader.setProperty(XMLEventReader.IS_COALESCING, Boolean.TRUE);
XML文档没有DTD。它是有效的。
XMLEventReader偶尔会报告接收到的CHARACTERS事件的内容是(减去引号),例如:
r problems were most severe and frequent.) Did you sleep a lot more than usual nearly every night during that period?</text> Ã
为什么XMLEventReader会搞砸解析?为什么字符显示不正确?如果是这样的话,为什么XMLEventReader不合并字符和事件呢?为什么斯塔克斯如此令人难以置信的丑陋和难以捉摸?
我正在Mac上使用Java运行时(Java6)提供的XMLEventReader。
下面是一些示例XML,当然我只是从编辑器中复制了这些XML,所以谁知道这会导致哪些字符转换,但无论如何:
<question id="BMHPD17">
<permittedResponseCount>1</permittedResponseCount>
<text>Itâs hard for me to stay out of trouble. (Would you say this is true or false for you?)</text>
<namedAnswerSet idref="TrueFalse"></namedAnswerSet>
</question>
注意第3行的“智能撇号”。
我是通过对CHARACTERS事件作出反应来阅读本文的,将其内容保存到堆栈上的字符串中,然后对一个名为“question”的END\u元素事件作出反应。在收到question的END_元素事件后,我检索刚才提到的字符串的值,并构造一个Java对象,将刚才提到的字符串作为输入。
当我系统输出打印()结果,我(有时)得到了我之前提到的假垃圾。
当我包起来的时候系统输出在一个带有“UTF8”编码集的PrintWriter中,这样我就不会简单地根据平台的编码输出字符了,我得到了相同的结果。