Dav*_*dRR 5 xml encoding http character-encoding
我遇到了一个Web服务,该服务返回Content-Type
带有UTF-8 的HTTP 标头charset
:
Content-Type: text/xml;charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
...以及XML声明encoding
属性,其值为ISO-8859-1(又名latin1):
<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
Run Code Online (Sandbox Code Playgroud)
当我尝试在Firefox中显示此Web服务的响应时,它显示XML解析错误:遇到á(小写字母a,带有锐利)时,格式不正确。
Firefox发出此解析错误的事实并不令我感到惊讶。我想说,不等同于HTTP字符集的XML编码永远是不正确的。我对吗?是否应始终将这种情况视为Web服务器配置问题?
你有test/xml
和UTF-8
字符集。在这种情况下, RFC 3023的第 8.1 节“带有 UTF-8 字符集的 Text/xml”适用。
\n\n\n<?xml 版本=“1.0”编码=“utf-8”?>
\n\n这是与 text/xml 一起使用的推荐字符集值。由于提供了 charset 参数,MIME 和 XML 处理器必须将封闭的实体视为 UTF-8 编码。
\n
不幸的是,这仅定义了 XML 编码也是 的情况utf-8
,而您在这里没有这种情况。
然而,还有一节,8.20“不一致的示例:带有 UTF-8 字符集的 Text/xml”,它准确地提到了您所遇到的情况:
\n\n\n\n\n内容类型:text/xml;字符集=“utf-8”
\n\n<?xml 版本 =“1.0”编码 =“iso-8859-1”?>
\n\n由于 charset 参数是在 Content-Type 标头中提供的,MIME 和 XML 处理器必须将所包含的实体视为 UTF-8 编码。也就是说,“iso-8859-1”编码必须被忽略。
\n
现在,您的文档可能(您应该使用十六进制编辑器进行验证)包含 ISO-8859-1 形式的 \xc3\xa1,即0xE1
(十六进制)。由于 ISO 编码被忽略并且应用 UTF-8,因此应该0xC3 0xA1
改为这样。
在 UTF-8 中,0xE1
它本身并不是一个字符。相反,它是涵盖 Unicode 范围 U+1000 到 U+1FFF 的 3 字节字符序列的开头。要知道它将解码为什么,我们需要知道 \xc3\xa1 之后的接下来的 2 个字节。它后面很可能是 ASCII 集中的“正常”字符。这将是一个无效字符,因为后面的 2 个字节必须0xE1
是0x80
或更高 - 因此会发生编码错误。
\n\n\n我想说的是,不等同于 HTTP 字符集的 XML 编码永远是不正确的。我对吗?
\n
好吧,至少不建议这样做,您需要详细了解 RFC 3023 才能知道在这种情况下会发生什么。如果内容类型和编码匹配,那就容易得多。
\n\n\n\n\n这种情况是否应该始终被视为 Web 服务器配置问题?
\n
不。这也可能是一个实现问题,例如程序员已经在应用程序中定义了内容类型和编码,并且您无法在网络服务器配置中对其进行太多操作。
\n