当前位置: 首页 > 知识库问答 >
问题:

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

杨和蔼
2023-03-14

我正在为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:

如果没有字符流,但有字节流,解析器将使用InputSource中指定的编码使用该字节流,或者(如果没有指定编码)使用XML规范中的算法自动检测字符编码。

我传递的是字节流,但我没有指定编码,因此根据文档,编码应该被自动检测。但事实并非如此。所有用UTF-8编码的文件都很好,但ISO-8859-1不是(我得到了一个解析器expat...一些无效字符的异常)。如果我手动将inputsource的编码设置为“ISO-8859-1”,则会发生相反的情况。

我该怎么解决这个?我搜索了Google和StackOverflow几个小时,但没有找到解决方案。我还试图将characterStream传递给inputsource,但是ISO-8859-1文件中的一些字符(äöüüüü)仍然显示为“?”在我的应用程序里。

提前感谢!

共有1个答案

羊舌庆
2023-03-14

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

如果在HTTP标头中没有设置编码,在XML序言中也没有指定编码,那么解析器如果采用UTF-8编码(按照XML规范的要求),则可以正确操作。文档中提到的autodetection并不意味着解析器实际上查看文档内容以对编码做出假设,而是意味着它检查XML流的编码属性。如果缺少编码属性,则默认为UTF-8。

 类似资料:
  • 我很难使用XSLT(使用氧气运行转换)从UTF-8编码的XML源生成ISO-8859-1编码的文本输出。 例如,当源包含破折号时,oxyow会抛出一个错误,“输出字符在此编码中不可用(十进制8211)”。 有简单明了的解决办法吗? 谢谢你的任何建议。

  • 我有一个Android应用程序,它读取带有SQL脚本的文件,将数据插入SQLite数据库。然而,我需要知道这个文件的详细编码,我有一个从SQLite读取信息的EditText,如果编码不正确,它将显示为无效字符,如“?”而不是像“ç,í,ã”这样的字符。 我有以下代码: 这适用于“ISO-8859-1”编码,如果我将“UTF-8”设置为字符集,则适用于UTF-8。我需要以编程方式检测字符集编码(U

  • XML生成成功,但是从源中获取的数据内容仍然采用ISO编码,没有使用UTF8解析。 通过将文件编码更改为ISO8859-1,内容被成功解析。 在JAXB对象中设置数据之前,我尝试转换数据,但在UTF-8中仍未解析。 问题只是在Linux下精确,有没有人知道如何操作ISO_8859_1数据并在xml中设置它而没有问题?

  • 问题内容: 我正在阅读XML文档(UTF-8),并最终使用ISO-8859-1在网页上显示内容。正如预期的那样,有几个字符显示不正确,比如,和(他们显示为?)。 是否可以将这些字符从UTF-8转换为ISO-8859-1? 这是我编写的尝试此功能的代码段: 我不太确定发生了什么问题,但是我认为是re​​adLine()引起了麻烦(因为字符串将是Java / UTF-16编码的?)。我尝试的另一种变化

  • 用UTF-8编码的XML模式是否可以验证一些用ISO-8859-2编码的XML或者编码必须相同? 架构:

  • 我在Spring项目中遇到编码问题。现在我使用 -Dfile.encoding=ISO-8859-1 参数运行 jvm (tomcat)。在我的.jsp文件中有几行: 在 Web 中.xml我定义了编码过滤器 但当我用波兰语字母łśżź传递值时,我遇到了一个问题。在我的java控制器中,打印(并保存在DB中)的值是用html代码代替抛光字母。例如 aaalł保存为aaal[am]#322;[上午]