2

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

我做错了什么?

4

1 回答 1

3

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

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

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

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

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

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

更新:

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

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

于 2013-08-10T19:52:01.420 回答