5

假设我有一个像这样的简单表格:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
    <div id="search">
      <form method="GET" action="/super-action">
        <input type="text" name="q" />
      </form>
    </div>
  </body>
</html>

输入如下:@tags "Cinéma Whatever"

表单 GET 请求会生成如下所示的 url:/super-action?q=%40tags+"Cinéma+Whatever"

现在我想在 location.hash 中使用 javascript 来重现它,使用井号而不是斜线,例如:/super-action#q=%40tags+"Cinéma+Whatever"

但是有了可用的功能,我得到了结果:

  • 转义(输入):@tags%20%22Cin%E9ma%20Whatever%22
  • 编码URI(输入):@tags%20%22Cin%C3%A9ma%20Whatever%22
  • 编码URI组件(输入):%40tags%20%22Cin%C3%A9ma%20Whatever%22
  • $(form).serialize(),不带 q=:%40tags+%22Cin%C3%A9ma+Whatever%22

问题:如何使输入值@tags "Cinéma Whatever"看起来像表单 GET 请求会执行的操作:%40tags+"Cinéma+Whatever"使用 javascript?

4

1 回答 1

4

根据RFC 1738/super-action?q=%40tags+"Cinéma+Whatever"在 URL 内无效:

因此,只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以在 URL 中未编码地使用。

这意味着您无法生成包含该子字符串的有效 URL。您必须"对特殊字符和进行编码é,否则生成的字符串不是 URL。

您认为这是有效的原因可能是您的浏览器在欺骗您:它可能会以部分编码的形式显示 URL,以便在地址栏中更容易阅读。尝试使用像 Wireshark 这样的协议分析器来检查通过网络发送的实际URL 路径。

更新:我很快确认了这一点,响应表单提交而发送的 HTTP 标头如下:

GET /?q=%40tags+%22Cin%C3%A9ma+Whatever%22 HTTP/1.1

所以它首先是 UTF-8 编码,然后是 URL 编码。

于 2012-05-14T15:52:00.497 回答