【问题标题】:Mismatch between HTTP 'charset' and XML 'encoding'HTTP 'charset' 和 XML 'encoding' 不匹配
【发布时间】:2014-12-27 21:19:20
【问题描述】:

我遇到了一个 Web 服务返回一个带有 UTF-8 charset 的 HTTP Content-Type 标头:

Content-Type: text/xml;charset=UTF-8

...和一个 XML 声明 encoding 属性,其值为 ISO-8859-1(又名,latin1):

<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>

当我尝试在 Firefox 中显示来自此 Web 服务的响应时,它会在遇到 á 时显示 XML Parsing Error: not well-formed (small letter a with acute )。

Firefox 发出此解析错误这一事实对我来说并不意外。我想说的是,不等同于 HTTP 字符集的 XML 编码是从不正确的。我对吗?这种情况总是是否应该被视为 Web 服务器配置问题?

【问题讨论】:

    标签: xml http encoding character-encoding


    【解决方案1】:

    问题

    您有 test/xmlUTF-8 字符集。在这种情况下,RFC 3023 的第 8.1 节“带有 UTF-8 字符集的文本/xml”适用。

    这是用于 text/xml 的推荐字符集值。由于提供了 charset 参数,MIME 和 XML 处理器必须将封闭的实体视为 UTF-8 编码。

    不幸的是,这仅定义了 XML 编码也是 utf-8 的情况,而您在这里没有。

    但是,还有一个部分,8.20“不一致的示例:带有 UTF-8 字符集的文本/xml”,它准确地提到了您的情况:

    内容类型:文本/xml; charset="utf-8"

    由于在 Content-Type 标头中提供了 charset 参数,MIME 和 XML 处理器必须将封闭的实体视为 UTF-8 编码。也就是说,必须忽略“iso-8859-1”编码。

    现在,您的文档可能(您应该使用十六进制编辑器进行验证)包含 ISO-8859-1 格式的 á,即 0xE1(十六进制)。由于 ISO 编码被忽略并应用 UTF-8,因此应该改为 0xC3 0xA1

    在 UTF-8 中,0xE1 本身不是字符。相反,它是一个 3 字节字符序列的开头,覆盖了 Unicode 范围 U+1000 到 U+1FFF。要知道它会解码成什么,我们需要知道 á 后面的接下来的 2 个字节。它很可能跟在 ASCII 集中的“正常”字符后面。这将是一个无效字符,因为 0xE1 后面的 2 个字节必须是 0x80 或更高 - 因此会发生编码错误。

    您的问题

    我想说,不等同于 HTTP 字符集的 XML 编码永远不会正确。我说的对吗?

    好吧,至少不建议这样做,您需要详细了解 RFC 3023 才能知道在这种情况下会发生什么。如果内容类型和编码匹配,就会容易得多。

    是否应该始终将这种情况视为 Web 服务器配置问题?

    没有。这也可能是一个实施问题,例如程序员已经在应用程序中定义了内容类型和编码,你不能在 webserver 配置中做太多的事情。

    【讨论】:

    • RFC 3023 第 8.20 节“不一致的示例:带有 UTF-8 字符集的文本/xml”确实准确地解决了我遇到的情况。关于我的问题“是否应该始终将这种情况视为 Web 服务器配置问题?”从客户端的角度来看,我认为可以说它一个Web服务器(或Web服务)配置问题。也就是说,没有什么是“合理的”客户本身可以解决问题的。相反,负责相关网站的任何人(服务器管理员和/或开发人员)都应该解决问题,是吗?
    • @DavidRR:是的,从客户的角度来看,您对此无能为力。 IT 管理员可能无法配置某些内容,否则,开发人员必须修复它。
    • 客户端可以稍微聪明一点,根据前8bit序列判断是不是utf8——如果不是有效的utf8。但这不符合 rfc 标准,而是一种互操作性破解——但如果您想与许多未知端点通信,则可能需要这样做。 (捕捉 EncodingExceptin 并使用声明字符集重试,最后使用 latin1)
    猜你喜欢
    • 2011-06-26
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多