javascript - 当涉及重音等时,如何从 javascript 以 GET 请求形式重现 url 编码?

标签 javascript encoding forms

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

<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
  • 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?

最佳答案

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

Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.

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

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

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

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

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

关于javascript - 当涉及重音等时,如何从 javascript 以 GET 请求形式重现 url 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545350/

相关文章:

java - 用Java实现LZ78算法

python - 无法使用 python 将文本作为 UTF-8 写入文件

php - CakePHP: "GET"表单在提交后不自动填充表单字段

javascript - 如何从对象数组中删除元素?

javascript - 评估 React JS 应用程序性能的最佳方法

javascript - 即使存储时,extjs 网格也不会显示预期数据,并且网格对象中存在列

c# - 如何在 GUID 中存储数据

php - 将 'check username' 添加到注册表 PHP

php - 可以改进此 PHP 代码吗?

javascript - 如何在 Visual Studio Code 中恢复 Javascript 语法错误检测