【发布时间】:2009-08-21 22:37:48
【问题描述】:
我正在编写一些代码来确定 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,我还能在文档的第一个字符中看到什么?
就我从规范中可以看出,这组将是:空格(空格、制表符、换行符、回车)和“<?xml?> 声明可能不存在,即使规范要求。
内部 DTD、处理指令、标签和 cmets 都以“
编辑:重写以强调我的特殊要求。
【问题讨论】:
-
我的建议是,如果服务器返回垃圾,告诉用户服务器返回垃圾。也许用户会变得足够愤怒,以至于他们会踢出确实控制服务的人来修复它。我们启用的松弛度越多,我们收到的松弛度就越多。
-
不幸的是,这不是一个实用的选择,因为大多数非技术用户不会区分我的应用程序和我正在显示的信息的来源。他们所看到的只是它不起作用。您不妨尝试通过一项法律,即所有 PHP 程序员在被允许编写任何 PHP 代码之前必须证明其具备字符编码的工作知识 :-)
-
@Don:您已经描述了程序中的错误 - 您的错误消息不清楚。该消息应显示类似“从服务器 servername 收到垃圾。请联系您的网络管理员并要求他停止发送垃圾”。它停在哪里?如果你向后弯得太远,你会摔断背部。
-
@Don:顺便说一句,我认为你应该向 PHP 开发人员道歉,因为他们暗示他们太愚蠢了,无法编写生成有效字符编码的 PHP 程序。
-
@John S:对不起,挖 PHP 程序员的目的是为了讽刺和幽默(因此最后是笑脸)。我之所以选择 PHP,是因为它是最流行的 Web 编程语言,并且拥有庞大的新手社区。span>
标签: xml parsing character-encoding