如何在jET请求中重现url编码,来自javascript,当涉及到重音等时?

bks*_*day 5 javascript forms encoding

说我有一个这样的简单形式:

<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>
Run Code Online (Sandbox Code Playgroud)

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

表单GET请求会生成一个类似于以下内容的网址: /super-action?q=%40tags+"Cinéma+Whatever"

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

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

  • 逸出(输入): @tags%20%22Cin%E9ma%20Whatever%22
  • 是encodeURI(输入): @tags%20%22Cin%C3%A9ma%20Whatever%22
  • encodeURIComponent方法(输入): %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?

Nik*_* B. 4

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

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n

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

\n\n
GET /?q=%40tags+%22Cin%C3%A9ma+Whatever%22 HTTP/1.1\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n