HTTP“字符集”和XML“编码”之间不匹配

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服务器配置问题?

Tho*_*ler 2

问题

\n\n

你有test/xmlUTF-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
\n\n

不幸的是,这仅定义了 XML 编码也是 的情况utf-8,而您在这里没有这种情况。

\n\n

然而,还有一节,8.20“不一致的示例:带有 UTF-8 字符集的 Text/xml”,它准确地提到了您所遇到的情况:

\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
\n\n

现在,您的文档可能(您应该使用十六进制编辑器进行验证)包含 ISO-8859-1 形式的 \xc3\xa1,即0xE1(十六进制)。由于 ISO 编码被忽略并且应用 UTF-8,因此应该0xC3 0xA1改为这样。

\n\n

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

\n\n

你的问题

\n\n
\n

我想说的是,不等同于 HTTP 字符集的 XML 编码永远是不正确的。我对吗?

\n
\n\n

好吧,至少不建议这样做,您需要详细了解 RFC 3023 才能知道在这种情况下会发生什么。如果内容类型和编码匹配,那就容易得多。

\n\n
\n

这种情况是否应该始终被视为 Web 服务器配置问题?

\n
\n\n

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

\n