【问题标题】:Parse XML file containing umlaute using SAX parser使用 SAX 解析器解析包含变音符号的 XML 文件
【发布时间】:2013-08-10 19:33:09
【问题描述】:

我浏览了很多关于同一问题的帖子,但我无法弄清楚。我试图解析一个带有变音符号的 XML 文件。这就是我现在拥有的:

File file = new File(this.xmlConfig);
InputStream inputStream= new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");

saxParser.parse(is, handlerConfig);

但它不会正确地得到变音符号。 Ä、Ü 和 Ö 将只是奇怪的字符。该文件绝对是 utf-8 格式,第一行是这样声明的:<?xml version="1.0" encoding="utf-8"?>

我做错了什么?

【问题讨论】:

    标签: java android xml saxparser


    【解决方案1】:

    第一条规则:不要再猜测 XML 文档中使用的编码。始终使用字节流来解析 XML 文档:

    InputStream inputStream= new FileInputStream(this.xmlConfig);
    InputSource is = new InputSource(inputStream);
    saxParser.parse(is, handlerConfig);
    

    如果这不起作用,则 XML 中的 <?xml version=".." encoding="UTF-8" ?>(或其他)是错误的,您必须从那里获取它。

    第二条规则:确保使用支持目标或结果文档中使用的编码的工具检查结果。有吗?

    第三条规则:检查源文档中的字节值。调出您最喜欢的 HEX 编辑器/查看器并检查内容。例如,字母Ä应该是字节序列0xC3 0x84,如果编码是UTF-8。

    第四条规则:如果它看起来不正确,请始终怀疑 UTf-8 源被视为或解释为 ISO-8859-1 源。通过将 UTF-8 源的第一个和第二个字节与 ISO 8859-1 code charts 进行比较来验证这一点。

    更新:

    UNICODE 字母ä(带分号的拉丁小写字母a,U+00E4)的字节序列在UTF-8 编码中为0xC3 0xA4。如果您使用的查看工具只能理解(或配置为将源解释为)ISO-8859-1 编码,则第一个字节0xC3是字母Ã,第二个字节是字母¤ ,或货币符号 (Unicode U+00A4),可能看起来像一个圆圈。

    因此,Android 中的“TextView”会将您的输入解释为 ISO-8859-1 流。我不知道是否可以改变它。但是,如果您将解析结果作为字符串或字节数组,则可以将其转换为 ISO-8859-1 流(或字节数组),然后将其提供给“TextView”。

    【讨论】:

    • 该行现在是<?xml version="1.0" encoding="UTF-8" ?>,我从您的答案更改为字节流。我还安装了一个十六进制查看器,发现小 ä 的字节序列 C3 A4 根据我对 utf-8 的发现似乎没问题。解析的结果显示在 android 的 TextView 中。我确实将它手动设置为 ä 在它工作。解析结果虽然显示了一个大 A,顶部有一个〜,旁边有一个圆圈。还有什么想法吗?非常感谢
    • 我终于找到了问题所在。 XML 文件确实通过了更改编码的应用程序其他部分上的另一个进程。几乎为此发疯。非常感谢。
    • 你不是第一个:“哦,那是疯狂所在;让我避开那个;不要再这样了”;-)
    猜你喜欢
    • 2010-11-30
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2023-03-05
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多