假设我有一个像这样的简单表单:
<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/