我遇到了一个Web服务,该服务返回Content-Type
带有UTF-8 的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解析错误:遇到á(小写字母a,带有a急性)时格式不正确。
Firefox发出此解析错误的事实并不令我感到惊讶。我想说的是,不等同于HTTP字符集的XML编码永远是不正确的。我对吗?是否应始终将这种情况视为Web服务器配置问题?
你有test/xml
和UTF-8
字符集。在这种情况下,RFC 3023的第8.1节“带有UTF-8字符集的Text / xml”适用。
<?xml版本=“ 1.0”编码=“ utf-8”?>
这是推荐用于text / xml的字符集值。由于提供了charset参数,因此MIME和XML处理器务必将包含的实体视为UTF-8编码。
不幸的是,这仅定义了XML编码也是的情况utf-8
,您在这里没有这种编码。
但是,还有另外一个小节,即8.20“不一致的示例:带有UTF-8字符集的Text / xml”,其中恰好提到了您遇到的情况:
内容类型:text / xml; charset =“ utf-8”
<?xml版本=“ 1.0”编码=“ iso-8859-1”?>
由于在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服务器配置问题?
不能。这也可能是一个实现问题,例如,程序员已在应用程序中定义了内容类型和编码,并且您在Web服务器配置中不能对此做太多事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句