HTTP'charset'与XML'编码'不匹配

时间:2014-10-31 14:06:46

标签: xml http encoding character-encoding

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

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解析错误:格式不正确({{3 }})。

Firefox发布此解析错误的事实并不令我感到意外。我想说一个不等同于HTTP字符集的XML编码是永远正确。我对吗?如果这种情况总是被视为Web服务器配置问题吗?

1 个答案:

答案 0 :(得分:2)

问题

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

  

&lt;?xml version =“1.0”encoding =“utf-8”?&gt;

     

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

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

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

  

内容类型:text / xml;字符集= “UTF-8”

     

&lt;?xml version =“1.0”encoding =“iso-8859-1”?&gt;

     

由于charset参数是在Content-Type头中提供的,因此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服务器配置问题?

没有。它也可能是一个实施问题,例如程序员已经在应用程序中定义了内容类型和编码,并且在Web服务器配置中无法对其进行多少操作。