【问题标题】:encoding of query string parameters in IE10IE10中查询字符串参数的编码
【发布时间】:2013-08-13 22:08:24
【问题描述】:

我收到一位客户的请求,他希望能够在 IE10 地址栏中输入带有参数的 Web 服务的查询字符串并获取服务结果。参数包括希伯来语字符串,如:

http://mywebsite.com/service.asmx/foo?param1=123&param2=מחרוזתבעברית

在我看来,IE10 不会对查询字符串参数进行编码——在 ? 之后的每个非 ASCII 字符。标记将转换为“3f”字节,尽管它确实对 ? 之前的内容进行了编码。 mark - url 本身。

例如,如果我尝试访问url(参数是虚构的,url不是,并且我与站点没有任何联系)

http://www.shlomo.co.il/pageshe/sales/רכב-למכירה.asp?param=פאראם 

并在wireshark中查看我发送到服务器的字节,它显示了我

您可以看到它确实将 URL 的希伯来语部分替换为 urlencoded 字符串,但将希伯来语参数替换为 ?????,即 '3f's。

chrome 中的相同字符串将被完整编码:

GET http://www.shlomo.co.il/pageshe/sales/%D7%A8%D7%9B%D7%91-%D7%9C%D7%9E%D7%9B%D7%99%D7%A8%D7%94.asp?param=%D7%A4%D7%90%D7%A8%D7%90%D7%9D HTTP/1.1

我在win7/IE10和winXPheb/IE8的机器上试过了。

我的 IE 设置是(特别是检查了“始终显示编码地址选项”以查看它是否有帮助并重新启动,但没有任何区别):

我试图四处搜索有关该问题的任何信息,但没有找到太多信息。

我的问题是:

  • 确实是这样,还是我遗漏了什么?
  • 此行为是否记录在任何地方?
  • IE/Win中是否有启用参数编码的设置。

附言当然,如果我正在开发客户端/Web ui,我会简单地对我的查询进行 urlencode,但我的客户请求正是将查询粘贴到 IE 地址栏,这就是我对这种特定行为感兴趣的原因。

谢谢。

【问题讨论】:

    标签: web-services internet-explorer url encoding


    【解决方案1】:

    是的,您对行为的观察是准确的。 Internet Explorer 10 及以下版本遵循复杂的算法来对 URL 进行编码。据称这是在 Internet Explorer 11 中更新的,但我发现新选项 doesn't seem to work

    “始终显示编码地址选项”涉及是否为 IDN 主机名显示 PunyCode,并且不影响查询字符串。 Send UTF-8 URLs 主要适用于路径的编码,虽然它也会影响其他代码路径

    该行为在任何地方都没有完整记录。我本来打算在我的 IEInternals 博客上写一篇关于它的完整文章,但最终在这样做之前离开了微软。 this blog post有部分解释。

    是的,有些设置会影响行为。工具 > Internet 选项 > 高级中的 Send UTF-8 URLs 复选框是确定如何发送 URL 的变量之一,但该选项不会盲目地执行它所暗示的事情(它仅 UTF-8 编码路径,而不是查询字符串)。涉及的其他变量包括:

    1. 输入 URL 的位置(例如地址栏与开始 > 运行等)
    2. 系统的 ANSI 代码页是什么(例如操作系统默认使用的区域设置)
    3. 浏览器中当前加载页面的字符集

    由于这些变量,您无法可靠地在 Internet Explorer 中使用未正确编码(例如 %-转义 UTF8)的 URL。

    【讨论】:

    • 相应地编辑了问题。花了我时间重新启动,否则我会尽快标记你的答案:)
    • 这里有很好的问答,尽管我尝试了 Browser Stack 的 IE 10 并检查“发送 UTF-8 URL”似乎可以解决问题。想知道它现在是否正确?
    • 感谢 Eric,这帮助我解决了这里的问题stackoverflow.com/questions/50224405/…
    【解决方案2】:

    不幸的是,对于 Internet Explorer 11(内部版本 11.0.9600.17358,win7-x64)仍然如此

    我看到您无法更改 Web 服务器。然而,那些正在开发新服务的人可能会考虑将请求参数更改为路径变量,例如从http://myserver.com/page?τεστ 变成http://myserver.com/τεστ/

    【讨论】:

      【解决方案3】:

      如果客户端从 javascript 调用网络服务, 可以使用encodeuricomponent。在你的情况下encodeuricomponent("מחרוזתבעברית");

      http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 2013-12-25
        • 2020-11-25
        相关资源
        最近更新 更多