XML文档中有效的第一个字符集是什么?

时间:2009-08-21 22:37:49

标签: xml parsing character-encoding

我正在研究一些代码来确定Web服务器返回的XML文档的字符编码(在这种特殊情况下是RSS提要)。不幸的是,有时Web服务器会告诉我文件是UTF-8,实际上它不是,或者服务器上的样板XML生成代码在开始时有<?xml encoding='UTF-8'?>但文档包含无效的UTF-8字节序列。

由于我无法控制服务器,因此我需要让我的客户端代码容忍这种不一致并显示某些内容,即使某些字符未正确解码。 这是我的申请的重要要求。

我很清楚服务器在这种情况下违反了XML规范。我尝试与服务器端开发人员合作,尽可能根据规范使事情正确,但有时这对他们或他们的组织来说是低优先级,或者服务器端代码没有被任何人主动维护。

为了保持健壮,我想查看XML数据的前几个字节,并尝试确定它是某种形式的UTF-16还是某种8位编码。我已经有了查找字节顺序标记(BOM)的代码。

但有时服务器不包含BOM,即使对于UTF-16也是如此。我想通过查看前两个字节并根据XML文档中可能的第一个字符列表检查它们来尝试找出它是否是UTF-16。

显然我必须在某处画线。如果文档不是格式良好的XML,我无论如何都无法解析它,除非我编写自己非常宽容的解析器(我不打算这样做)。但鉴于它的结构良好,除了BOM之外,我还能在文档的第一个字符中看到什么?

到目前为止,我从查看规范可以看出,这个集合将是:空格(空格,制表符,新行,回车符)和'&lt;'。那里的任何XML专家都知道我可能遗失的任何东西吗?我需要假设即使规范要求,<?xml?>声明也可能不存在。

内部DTD,处理指令,标签和注释都以'&lt;'开头。是否有可能在文档的开头有一个实体(以'&amp;'开头)或其他东西?

编辑:改写以强调我的特殊要求。

3 个答案:

答案 0 :(得分:2)

XML规范提供了有关检测字符编码的some guidance。问题是,几乎不可能查看前几个字节并告知它是UTF-8还是ISO-8859-1或CP437。规范包含的信息至少可以让您区分格式良好的文档。

答案 1 :(得分:1)

问题是,如果Feed无效,则可能不遵守有关合法字符的任何规则。看一下Universal Feed Parser的代码。它是经过充分测试的代码,用于将垃圾文本解析为可能正确的数据结构。

UFP使用名为Universal Encoding Detector的子库,该子库应包含有关一般编码检测的有用信息。

答案 2 :(得分:0)

这并不理想,但有时我需要应对不良编码(pseduo-code alert)。

str = decode("utf-8", input)
if (!str) {
  str = decode("cp1252", input)
}

也就是说,尝试将输入解释为UTF-8,如果失败,则将其视为来自Windows系统(可能是它)。这对我来说似乎是一个合理的妥协。

当然,这确实要求您首先将整个输入下载到内存中,这可能不实用。