1

我有一个 XMLEventReader。它是从使用“UTF8”编码的 XMLInputFactory 构建的。我正在使用它来读取“编码”属性设置为“UTF-8”的 XML 文件。

我已验证 XML 文件在 Firefox 下正确查看。当您查看页面编码时,它会说它是 UTF-8。

我已将 XMLEventReader 设置为合并字符事件,如下所示:

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>  Ð 

请注意样本末尾附近存在标记标签,以及大写的荆棘。另请注意,该句子已被删除;大概在此之前还有另一个 CHARACTERS 事件,其中包含句子的前导部分。

为什么 XMLEventReader 搞砸了解析?为什么字符显示不正确?为什么 XMLEventReader 不合并 CHARACTERS 事件,如果是这样的话?为什么 StAX 如此丑陋和不可预测,令人难以置信?

我在 Mac 上使用我的 Java 运行时 (Java 6) 提供给我的 XMLEventReader。

这是一些示例 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 事件做出反应,将其内容保存到堆栈上的字符串,然后对名称为“问题”的 END_ELEMENT 事件做出反应来阅读此内容。在接收到 END_ELEMENT 事件后,我检索了我刚才提到的字符串的值,并构造了一个 Java 对象,该对象将我刚才提到的字符串作为输入。

当我 System.out.println() 结果时,我(有时)得到我之前提到的虚假垃圾。

当我将 System.out 包装在带有“UTF8”编码集的 PrintWriter 中时,这样我就不会简单地根据平台的编码输出字符,我会得到相同的结果。

4

2 回答 2

2

这原来是 Mac OSX 的 JVM 上的一个错误。控制台使用的字符编码不默认为 UTF-8,即使默认字符编码的所有其他用法都是UTF8。

于 2010-11-12T18:53:02.643 回答
0

这甚至与包含起始偏移量和长度的基础 SAX 事件相同吗?如果是这样,您可能会发现这些指定了排除标记的字符串区域。

于 2010-09-09T19:55:44.197 回答