【问题标题】:Internet Explorer having problems with special chars in querystringsInternet Explorer 在查询字符串中遇到特殊字符问题
【发布时间】:2015-10-28 12:30:06
【问题描述】:

这不是一个新问题

这里有很多关于 IE 在处理查询字符串中的特殊字符时遇到问题的问题。在所有情况下都是一样的:Chrome、Firefox、Safari(每个人)都能正确处理 UTF-8 编码的 URL,几乎所有这些都可以处理 IRI 未编码为 URL 的情况。但 IE 坚持让开发者过得不亦乐乎。

因为我自己也遇到了这个问题,并且已经解决了很多问题。在我看来,IE 似乎出于某种原因坚持将 UTF-8 编码的 URL 解码为 ISO-8859-1,然后再将其发送到服务器。

我的情况

我是丹麦的居民,因此我必须使用丹麦字母 æøå。 在很多情况下,我想将视图中的参数发送到某些 C# 方法中。此类经常弹出特殊字符的地方有两个例子:

  1. 正在搜索
  2. 指定下载文件的文件名

假设一个丹麦人想要搜索丹麦语单词“æ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 是 字节的十六进制值

http://www.w3.org/International/O-URL-code.html

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

正在发送到服务器。

这是我的配置:

  1. 文件保存为 UTF-8
  2. 我设置了元标记:

    <meta charset="UTF-8">
    
  3. IE 以 UTF-8 格式发送 URL 路径(也将 IE 设置为 对 Intranet 查询字符串执行此操作)

  4. 全球化设置为 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 IE11encoding 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


【解决方案1】:

对未来人们提出这个问题的答案。

玩弄这个,我得出的结论是,我唯一能做的就是对我所有的 URL 进行编码,然后使用 Content Disposition (with help from this SO post) 使其适用于不同的浏览器。解决方案并不完美,仍然存在一些缺陷,但这是我目前找到的最好的方法。

在我的所有情况下,链接都是用 JS 构建的,所以encodeURIComponent 是我对 URL 进行编码的首选方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2016-04-22
    • 1970-01-01
    • 2011-10-08
    • 2011-06-12
    • 2020-06-22
    相关资源
    最近更新 更多