【发布时间】:2015-10-28 12:30:06
【问题描述】:
这不是一个新问题
这里有很多关于 IE 在处理查询字符串中的特殊字符时遇到问题的问题。在所有情况下都是一样的:Chrome、Firefox、Safari(每个人)都能正确处理 UTF-8 编码的 URL,几乎所有这些都可以处理 IRI 未编码为 URL 的情况。但 IE 坚持让开发者过得不亦乐乎。
因为我自己也遇到了这个问题,并且已经解决了很多问题。在我看来,IE 似乎出于某种原因坚持将 UTF-8 编码的 URL 解码为 ISO-8859-1,然后再将其发送到服务器。
我的情况
我是丹麦的居民,因此我必须使用丹麦字母 æøå。 在很多情况下,我想将视图中的参数发送到某些 C# 方法中。此类经常弹出特殊字符的地方有两个例子:
- 正在搜索
- 指定下载文件的文件名
假设一个丹麦人想要搜索丹麦语单词“æblegrød”(一种特殊的苹果派)。在 Chrome 和 Firefox 中,如果我只是向浏览器提供 IRI:
http://example.com/Search/QuickSearch?searchQuery=æblegrød
发送到服务器的查询如下所示:
http://example.com/Search/QuickSearch?searchQuery=%C3%A6blegr%C3%B8d
在 Internet Explorer 中,它看起来像这样:
http://example.com/Search/QuickSearch?searchQuery=æblegrød
现在很容易看出问题所在。 Firefox 和 Chrome 对 URL 进行 URL 编码
... 不是 ASCII 字母或数字的每个字节到 %HH,其中 HH 是 字节的十六进制值
Internet Exlorer 直接对字符串进行 UTF-8 编码,结果是“æblegrød”。这也与您获取 UTF-8 字符串并将其解码为 ISO-8859-1 一样的最终结果,这是巧合吗?
我尝试了一些方法
由于 Internet Explorer 具有“以 UTF-8 格式发送 URL 路径”的选项,因此我尝试禁用该选项。没有任何改变。
当 IE 必须处理“searchQuery=æblegrød”时出现问题,我尝试在将 IRI 交给浏览器之前对其进行编码。导致所有浏览器都可以使用以下 URL:
http://example.com/Search/QuickSearch?searchQuery=%C3%A6blegr%C3%B8d
IE 不在乎,我在网络日志中看到的仍然是 URL
http://example.com/Search/QuickSearch?searchQuery=æblegrød
正在发送到服务器。
这是我的配置:
- 文件保存为 UTF-8
-
我设置了元标记:
<meta charset="UTF-8"> IE 以 UTF-8 格式发送 URL 路径(也将 IE 设置为 对 Intranet 查询字符串执行此操作)
-
全球化设置为 UTF-8
<globalization uiCulture="da-DK" culture="da-Dk" fileEncoding="utf-8" responseEncoding="utf-8" requestEncoding="utf-8" responseHeaderEncoding="utf-8" />
我的想法不多了,我不知道我做错了什么。我倾向于 IE 造成破坏,但我真的不知道这是否是我在项目中设置错误的东西。
【问题讨论】:
-
您遇到的是许多 IE 版本的已知问题,包括 11 版本。例如,请参阅 Unicode in URL changes for IE11 和 encoding of query string parameters in IE10。
-
æblegrød是æblegrød的 UTF-8 编码形式,当被视为 ISO-8859-1 时。 IE 将查询字符串正确编码为 UTF-8,它只是按原样传输 UTF-8(很可能是因为您的 HTML 页面的字符集是 UTF-8),而不是对%HH中的非 ASCII 字节八位字节进行十六进制编码格式,就像其他浏览器一样。 -
此问题可能与 IE 如何提交 HTML 表单有关,如此 MSDN 博客文章中所述:Brain Dump: International Text。注意:“IE 中的 URL 最多可以同时使用三种 (!!) 不同的编码:主机名中的 punycode、路径中的 %-escaped UTF-8,以及查询中的 raw codepaged-ANSI 和片段组件。这显然是一团糟,但修复它以匹配 IRI 规范会产生兼容性成本。(相信我,我们已经尝试过!)“。
-
基本上,您无法真正改变 IE 的行为。这就是它的工作原理。你没有做错任何事。
-
@RemyLebeau 如果我无法改变 IE 的行为,那么我可以做些什么来解决或解决它吗?据我所知,EricLaw 说我应该能够使用“正确编码”的 URL,但尝试这样做,我得到了你所说的“当被视为 ISO 时,æblegrød 是 æblegrød 的 UTF-8 编码形式-8859-1”(在“我已经尝试过一些事情”部分也提到了)
标签: .net internet-explorer url encoding utf-8