繁体   English   中英

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

[英]What is the set of valid first characters in an XML document?

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

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

我很清楚这种情况下服务器违反了XML规范。 我会尽可能与服务器端开发人员合作,以根据规范使事情变得正确,但是有时这对于他们或他们的组织而言是低优先级的,或者任何人都不会积极维护服务器端代码。

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

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

显然我必须在某处画线。 如果该文档不是格式正确的XML,则除非我编写了自己的非常宽容的解析器(我不打算这样做),否则我还是无法解析它。 但是考虑到它的格式正确,除了BOM之外,我在文档的第一个字符中还能看到什么?

据我从规范看,该集合应该是:空格(空格,制表符,换行,回车)和'<'。 是否有任何XML专家知道我可能缺少的任何信息? 我需要假设即使规范要求也可能不存在<?xml?>声明。

内部DTD,处理指令,标签和注释均以“ <”开头。 在文档的开头是否可以有一个实体(以“&”开头)或其他?

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

XML规范提供有关检测字符编码的一些指导 问题在于,几乎不可能查看前几个字节,然后就知道它是UTF-8还是ISO-8859-1或CP437。 规范包含的信息至少可以让您区分格式正确的文档。

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

UFP使用一个名为Universal Encoding Detector的子库,该子库应包含有用的信息以进行常规编码检测。

这并不理想,但是当我需要处理不良编码(pseduo代码警报)时,有时会这样做。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM