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

标签 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?

最佳答案

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

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

将使用平台默认 编码将二进制数据转换为 InputStreamReader 中的文本。 XML 解析器不再执行此操作 - 它看不到原始字节。

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

关于java - 为什么在文件包含特殊 UTF-8 字符时使用 InputSource 修复 SAX 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11397678/

相关文章:

java - Sentry Java Slack 通知 - 排除警告

java - Apache Camel XML 路由中的简单谓词不起作用 - 需要将 header 转换为字符串?

java - 为什么在 Tomcat 加载和读取 beans.xml 时没有正确加载 Spring AOP XML 模式

Python 如何扩展 `str` 并重载其构造函数?

c++ - 无需迭代即可从字符串数组中识别特定字符串

java - Hadoop:压缩 Map-only 作业的输出

java - 设置-XX :+DisableExplicitGC in production: what could go wrong?

java - 将 XML 中的 Base64 编码数据保存到文件中

python - 迭代字符串中子字符串的位置

java - JCO_ERROR_RESOURCE : Destination does not exist