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