当文件包含特殊的UTF-8字符时,为什么使用InputSource修复了SAX解析器

时间:2012-07-09 14:58:18

标签: java xml string sax

我希望得到一个解释,当我的XML文件中包含一些特殊的UTF-8字符时,我的SAX解析器失败的原因。

要解析XML文件,请使用Document doc = builder.parse(inputSource);

但是,当我使用inputSource时,它可以正常工作:

DocumentBuilder builder = factory.newDocumentBuilder();
InputStream in = new FileInputStream(file);
InputSource inputSource = new InputSource(new InputStreamReader(in));
Document doc = builder.parse(inputSource);

我不太明白为什么后者有效。我已经看到它被使用的例子,但没有解释为什么它的工作原理。 第二个是解析字符串而不是文件,因此编码将是UTF-8?

1 个答案:

答案 0 :(得分:7)

我怀疑您的文档在您声明的编码中不是真正。这一行:

InputSource inputSource = new InputSource(new InputStreamReader(in));

将使用平台默认编码将二进制数据转换为InputStreamReader内的文本。 XML解析器不再这样做 - 它无法看到原始字节。

如果这样做,你的XML文件可能会巧妙地破灭 - 它可能是声明它是UTF-8,但是使用平台默认编码(例如Windows-1252)。如果您有任何选择,则应该修复XML,而不是使用变通方法。