java - 用于 UTF-8 或 ISO-8859-1 编码 XML 的动态 SAX 解析器

标签 java android xml encoding sax

我正在为 Android 开发一个应用程序,我必须在其中解析不同的 XML 文件。其中大部分以 UTF-8 编码,但少数可能以 ISO-8859-1 编码。

  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  ...
  in = con.getInputStream();
  InputSource is = new InputSource(in);
  ...
  parser.parse(is, handler);

我处理输入的代码如上所示。 java 文档说明了 InputSource:

If there is no character stream, but there is a byte stream, the parser will use that byte stream, using the encoding specified in the InputSource or else (if no encoding is specified) autodetecting the character encoding using an algorithm such as the one in the XML specification.

我正在传递 ByteStream 并且我没有指定编码,因此根据文档应该自动检测编码。但事实并非如此。所有以 UTF-8 编码的文件都很好,但 ISO-8859-1 的文件不是(我得到一个 Parser Expat... Exception for some invalid characters)。如果我手动将 InputSource 的编码设置为“ISO-8859-1”,它会以相反的方式运行。

我该如何解决这个问题?我在 Google 和 Stackoverflow 上搜索了几个小时,但没有找到解决方案。我还尝试将 CharacterStream 传递给 InputSource,但 ISO-8859-1 文件中的某些字符 (äöüÄÖÜß) 仍显示为“?”在我的应用程序中。

提前致谢!

最佳答案

最佳解决方案取决于问题的确切原因。如果您通过 HTTP 检索 XML 文档,编码也可以在 Content-Type 响应 header 中指定,而不必在 XML 文档本身中指定。如果是这种情况并且 Android 中的 XML 库已正确实现(我无法在此处检查是否评估了 Content+Type header ),您应该能够直接使用 URL 创建一个 InputSource new InputSource( "http://..."); 代替。

如果编码未在 HTTP header 中设置且未在 XML 序言中指定,则如果解析器采用 UTF-8 编码(如 XML 规范所要求的),则解析器将正确运行。文档中提到的自动检测并不意味着解析器实际查看文档内容以对编码做出假设,而是意味着它检查 XML 流的编码属性。如果缺少编码属性,则默认为 UTF-8。

关于java - 用于 UTF-8 或 ISO-8859-1 编码 XML 的动态 SAX 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13858564/

相关文章:

android - 如何让 TabLayout 占满屏幕宽度?

java - C++ 的 STL 队列在 Java 中的等价物是什么?

java - 操作栏选项卡全部显示在一个 View 中,而不是可滚动

Java8 - 如何知道夏令时现在是否开启

java - 为什么 Android 监听器通常在 Activity 中实现?

android如何通过代码设置手机闹钟

c# - 获取 XML 文件的版本而不从服务器下载它

xml - 在 R 中是否有更好的方法来完成这个 XML 抓取任务?

c# - C# 的 DataSet WriteXML 转换的奇怪结果

java - Java 中的信用卡洗涤器/ sanitizer 库