【发布时间】:2015-10-30 20:10:10
【问题描述】:
好的,我有一个由其他人编写的 Android 应用,但我的工作是维护和进一步开发。该应用程序使用一个以 XML 格式回答的 API。代码很标准:
InputStream in = httpConnection.getInputStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(in);
除非标签名称中有非拉丁字符,否则一切正常。 例如这样就可以了:
<Milen>some_text</Milen>
但这引发了一个异常:
<Милен>some_text</Милен>
例外是INVALID_CHARACTER_ERR。经过一番调查,我发现DOM API 的实现是org.apache.harmony.xml.dom.DocumentImpl。并且在第 286 行引发了异常here。if 检查归结为这种方法:
private static boolean isXMLIdentifierPart(char c) {
return isXMLIdentifierStart(c) || (c >= '0' && c <= '9') || (c == '-') || (c == '.');
}
这基本上排除了任何非拉丁字符。但是,根据this,任何 Unicode 字符都是有效的标签名称。
所以我的问题是:
- 为什么会有这样一项违反标准的检查?
- 我有哪些选项可以让 DOM 解析器处理非拉丁 Unicode 字符?
一些补充说明:
- 服务器返回正确的 UTF-8 响应
- 我尝试过使用XML escaping,但很明显,在签入
isXMLIdentifierPart之前这已转换回原始Unicode - 我强烈倾向于坚持使用 DOM 解析器 API,因为之后的处理假定将 Document 对象传递给它。重写处理过程需要大量工作。
我想到的两个解决方案是:
- 获取 org.apache.harmony.xml.dom.DocumentImpl 实现的代码并创建缺少问题检查的自定义解析器。
- 让服务器使用一些仅使用拉丁字符的自定义架构对非拉丁字符进行编码(\u1234 或 U+1234 不起作用),然后在解析器完成工作后将其解码。
但是,这两种解决方案都是非标准的,并且都不喜欢它们。因此,任何适当的方法都非常受欢迎!!!
免责声明:我是 Android 平台的新手,我可能会遗漏一些简单/明显的东西。但是,经过两天的研究和实验,我没有找到它。
【问题讨论】: