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

Dec*_*ter 3 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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

我怀疑你的文件是不是真的在你声明的编码.这一行:

InputSource inputSource = new InputSource(new InputStreamReader(in));
Run Code Online (Sandbox Code Playgroud)

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

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