Internet Explorer在查询字符串中遇到特殊字符问题

时间:2015-10-28 12:30:06

标签: .net internet-explorer url encoding utf-8

这不是问题

这里有很多问题关于IE在查询字符串中处理特殊字符时遇到一些问题。在所有情况下它都是相同的:Chrome,Firefox,Safari(每个人)正确处理UTF-8编码的URL,几乎所有这些URL甚至可以处理IRI未编码为URL的情况。但IE坚持要让开发人员过上艰难的生活。

因为我自己遇到了这个问题,并且已经有了很多工作。对我来说,似乎IE出于某种原因坚持在将UTF-8编码的URL发送到服务器之前将其解码为ISO-8859-1。

我的案例

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

  1. 搜索
  2. 下载文件的文件名规范
  3. 说丹麦人想要搜索丹麦语“æ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是对网址进行编码的网址

      

    ...每个字节不是ASCII字母或数字到%HH,其中HH是   字节的十六进制值

         

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

    其中Internet Exlorer正在对字符串执行直接的UTF-8编码,从而产生“Ã||||”。这也是一样的最终结果,就好像你接受一个UTF-8字符串并将其解码为ISO-8859-1一样,这是巧合吗?

    我尝试了一些事情

    由于Internet Explorer可以选择“将URL路径发送为UTF-8”,我尝试禁用它。什么都不改变。

    当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将URL路径发送为UTF-8(也将IE设置为 为Intranet查询字符串执行此操作)

    4. 全球化设置为UTF-8

      <globalization          
          uiCulture="da-DK"
          culture="da-Dk"
      
          fileEncoding="utf-8"
          responseEncoding="utf-8"
          requestEncoding="utf-8"
          responseHeaderEncoding="utf-8" />
      
    5. 我的想法已经不多了,我不知道我做错了什么。我倾向于IE造成破坏,但我真的不知道这是否是我在我的项目中错误设置的。

1 个答案:

答案 0 :(得分:4)

未来人们回答这个问题的答案。

解决这个问题,我得出的结论是,我唯一能做的就是对我的所有网址进行编码,然后使用内容处理(with help from this SO post)使其适用于不同的浏览器。解决方案并不完美,但仍存在一些缺陷,但这是迄今为止我发现的最佳方法。

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