我遇到了一个返回带有 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服务器配置问题吗?
答案 0 :(得分:2)
您拥有test/xml
和UTF-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服务器配置中无法对其进行多少操作。