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

我遇到了一个Web服务,它返回一个带有UTF-8字符集的HTTP Content-Type标头:

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

…和一个XML声明编码属性,其值为ISO-8859-1(aka,latin1):

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

当我尝试在Firefox中显示来自此Web服务的响应时,它会显示XML解析错误:遇到á(small letter a with acute)时格式不正确.

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

最佳答案 问题

你有test / xml和UTF-8字符集.在这种情况下,适用第07节“带有UTF-8字符集的文本/ xml”.

<?xml version=”1.0″ encoding=”utf-8″?>

This is the recommended charset value for use with text/xml. Since the charset parameter is provided, MIME and XML processors MUST treat the enclosed entity as UTF-8 encoded.

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

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

Content-type: text/xml; charset=”utf-8″

<?xml version=”1.0″ encoding=”iso-8859-1″?>

Since the charset parameter is provided in the Content-Type header, MIME and XML processors MUST treat the enclosed entity as UTF-8 encoded. That is, the “iso-8859-1” encoding MUST be ignored.

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

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

你的问题

I want to say that an XML encoding that is not equivalent to the HTTP character set is never correct. Am I right?

好吧,它至少不推荐,你需要详细了解RFC 3023才能知道在这种情况下会发生什么.如果内容类型和编码匹配则更容易.

Should such a situation always be considered a web server configuration problem?

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

点赞