【问题标题】:Odd HTML/XML encoding issue奇怪的 HTML/XML 编码问题
【发布时间】:2011-10-17 09:56:57
【问题描述】:

我在使用我们定制的内容管理系统构建的网站时遇到了一些实际问题。系统通过 XSLT 渲染所有视图,这可能是问题所在。

我们遇到的问题似乎是字符编码不匹配的结果,但我正在努力找出过程的哪一部分出现故障。

在 Firefox 或 Chrome 中不会出现该问题,并且在 IE 中对于页面的初始加载和刷新时很好,但是,当在 IE 中使用“后退”按钮或“前进”按钮时,我发现任何 unicode 字符都显示为黑色菱形中的白色问号,这意味着使用了错误的字符集。我们也看到了奇怪的结果,因为这个页面被 google 索引(它似乎索引 DOCTYPE 引用和 head 元素的内容,而不是通常情况下的内容)。

所有的 XSLT 样式表都输出 UTF-16 并且 XSLT 文件本身是 UTF-16 文件(以前存在不匹配)。该网站以 UTF-16 格式提供页面,HTML 输出有一个元标记,将内容类型设置为使用 UTF-16 字符集。

我已经使用 Fiddler 检查了结果以查看来自服务器的内容,但是,当 IE 使用后退/前进按钮时,Fiddler 没有记录请求/响应,因此可能是它已将它们缓存在某个地方。

有人有什么想法吗?

【问题讨论】:

  • 对上述内容的更新:当我在 IE 中查看源代码时(IE8 以防它有任何不同),我遇到了编码问题(我的默认文本编辑器将其加载为十六进制)跨度>
  • 有关在 Web 上使用 UTF-16 的一些问题,请参阅 w3.org/International/questions/…。您是在内容管理系统内的服务器上执行 XSLT 转换,还是让浏览器执行 XSLT?您有我们可以访问的公共 URL 吗?

标签: html xml unicode xhtml xslt


【解决方案1】:

网站以 UTF-16 格式提供页面

哇!不要那样做。

有几个与 UTF-16 页面有关的浏览器错误。我以前没有听说过这个特殊的,但例如,UTF-16 破坏表单处理是很常见的。 UTF-16 在网络上很少使用,因此它会在浏览器和其他代理中出现许多鲜为人知的错误(例如搜索引擎和其他工具,这些工具是用多种脚本语言之一编写的,但 Unicode 支持很差,例如PHP)。

HTML 输出有一个元标记,将内容类型设置为使用 UTF-16 字符集

这没有效果。如果浏览器无法检测到 UTF-16,那么由于 UTF-16 不兼容 ASCII,它甚至无法读取元标记。

在网络上,始终使用与 ASCII 兼容的编码,通常是 UTF-8。 UTF-8 是迄今为止最受支持的编码,并且几乎总是比 UTF-16 小。 UTF-16 几乎没有任何优势,我会在任何情况下都避免使用它。

【讨论】:

  • 是的,很清楚 UTF-8 是网络上的首选编码,但我在这里使用的是遗留代码。更改为 UTF-8 意味着将每个 XSLT 文件更改为输出 UTF-8,修改 XSLT 处理例程(.NET 默认对所有字符串使用 UTF-16,因此目前用于处理的方法将始终生成 UTF -16 输出),最重要的是,在此 CMS 平台上运行的其他站点在设置为呈现 UTF-16 文件时工作正常(尽管 IIS 似乎确实将它们作为 UTF-8 服务)。
【解决方案2】:

从缓存中读取文件时,IE 可能会损坏这些文件。可能与这个(不幸的是没有回答)问题有关

Firefox & IE: Corrupted data when retrieved from cache

您可以检查/尝试一些事情:

  • 确保在 XML 顶部的 http Content-Type: 标头和 <?xml encoding=...> 声明中都指定了编码
  • 您是指定 UTF-16 的字节序还是依赖字节顺序标记?如果后者尝试指定。我认为 windows 通常喜欢 UTF-16LE。
  • 您可以尝试其他编码吗?即UTF-8?
  • 您能否从服务器端禁用缓存(如果可行)? pragma: no-cache 或任何现代的等价物? (抱歉,我玩这个东西已经有一段时间了)。

对不起,这里没有真正的答案,但写得太多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多