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

Mar*_*000 5 java xml encoding android 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);
Run Code Online (Sandbox Code Playgroud)

我处理输入的代码如上所示.该java文件说,有关InputSource:

如果没有字符流,但是有字节流,则解析器将使用该字节流,使用InputSource中指定的编码,否则(如果未指定编码)使用诸如中的编码之类的算法自动检测字符编码XML规范.

我正在传入a ByteStream并且我没有指定编码,因此根据文档,应该自动检测编码.但事实并非如此.所有以UTF-8编码的文件都很好,但ISO-8859-1不是(我得到的Parser Expat... Exception for some invalid characters).如果我将InputSource手动编码设置为"ISO-8859-1",则表现相反.

我怎么解决这个问题?我搜索谷歌Stackoverflow几个小时,但没有找到解决方案.我也尝试传递CharacterStreamInputSource,但(äöüÄÖÜß)ISO-8859-1文件中的某些字符仍然显示为"?" 在我的应用程序中

提前致谢!

jar*_*bjo 1

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

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