使用SAX解析器解析包含umlaute的XML文件

时间:2013-08-10 19:33:10

标签: java android xml saxparser

我已经浏览了很多关于同样问题的帖子,但我无法弄清楚。我试图用变音符号解析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"?>

我做错了什么?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

<强>更新

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

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