你在哪里发现 0x12 是重音?UTF-8 的字符范围为 0x00-0x7F,编码与 ASCII 相同,ASCII 码点 0x12 是控制字符、DC2 或 CTRL+R。
这听起来像是某种编码问题。解决这个问题的最简单方法是查看您在十六进制编辑器中保存的文件。有一些事情需要检查:
- 开头的字节顺序标记 (BOM) 可能会混淆一些 XML 解析器
- 即使 XML 声明说编码是 UTF-8,它实际上也可能没有这种编码,并且文件将被错误地解码。
- 并非所有 unicode 字符在 XML 中都是合法的,这就是 firefox 拒绝呈现它的原因。特别是,XML 规范说 0x9、0xA 和 0xD 是唯一小于 0x20 的有效字符,所以 0x12 肯定会导致兼容的解析器抱怨。
如果您可以将文件上传到 pastebin 或类似文件,我可以帮助查找原因并提出解决方案。
编辑:好的,你不能上传。这是可以理解的。
您得到的 XML 不知何故损坏了,理想的做法是联系负责生成它的一方,看看是否可以解决问题。
不过,在这样做之前要检查一件事 - 你确定你的数据不受干扰吗?某些形式的通信 (SMS)只允许使用 7 位字符。这会将 0x92(ASCII 正向刻度/撇号 - 重音符?)变成 0x12。似乎很巧合,特别是如果这些出现在您期望重音的文件中。
否则,您将不得不尽力利用您所拥有的:
尽管不是绝对必要的,但请保持防御并将“UTF-8”作为第二个参数传递给setInput
解析器上的 , 。
同样,通过传递不同的编码作为第二个参数,强制解析器使用另一种字符编码。除了“UTF-8”之外,要尝试的编码是“iso-8859-1”和“UTF-16”。Sun 站点上提供了支持的 Java 编码的完整列表- 您可以尝试所有这些。(我找不到 Android 支持的编码的明确列表。)
作为最后的手段,您可以删除无效字符,例如删除 0x20 以下的所有非空白字符(0x9,0xA 和 0xD 都是空白字符)。如果删除它们很困难,您可以替换它们。
例如
class ReplacingInputStream extends FilterInputStream
{
public int read() throws IOException
{
int read = super.read();
if (read!=-1 && read<0x20 && !(read==0x9 || read==0xA || read==0xB))
read = 0x20;
return read;
}
}
您将其包装在现有的输入流中,它会过滤掉无效字符。请注意,您可能很容易对 XML 造成更大的破坏,或者以无意义的 XML 告终,但同样可以让您获取所需的数据或更容易地找出问题所在。