JS encodeURIComponent结果与FORM创建的结果不同

时间:2010-04-09 13:47:47

标签: javascript urlencode url-encoding encodeuricomponent

我认为在表单中输入的值是由浏览器正确编码的。

但是这个简单的测试文件“test_get_vs_encodeuri.html”显示它不是真的:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
   <title></title>
</head><body>

<form id="test" action="test_get_vs_encodeuri.html" method="GET" onsubmit="alert(encodeURIComponent(this.one.value));">
   <input name="one" type="text" value="Euro-€">
   <input type="submit" value="SUBMIT">
</form>

</body></html>

点击提交按钮时:

encodeURICompenent将输入值编码为“Euro-%E2%82%AC”

浏览器进入GET查询只写一个简单的“Euro-%80”

  1. 有人可以解释一下吗?

  2. 我如何使用Javascript ???()以相同的方式对borwser的FORM(windows-1252)进行编码?(escape函数不起作用,encodeURIComponent也不起作用)?

  3. 或者是encodeURIComponent做了不必要的转换吗?

2 个答案:

答案 0 :(得分:5)

这是一个字符编码问题。您的文档正在使用charset Windows-1252,其中位于128位,使用Windows-1252编码为0x80。但encodeURICompenent期望输入为UTF-8,因此使用Unicode的字符集,其中位于使用UTF-8 0xE282AC编码的位置8364(PDF)。

解决方案是将UTF-8用于您的文档。或者你编写一个映射来将UTF-8编码的字符串转换为Windows-1252。

答案 1 :(得分:0)

我认为问题的根源是字符编码。如果我在元标记中乱用charset并使用不同的编码保存文件,我可以在浏览器中呈现页面,如下所示:

Content encoding issue http://www.boogdesign.com/examples/encode/content-encoding-issue.png

€看起来很像你从encodeURIComponent得到的东西。但是,我找不到任何编码组合,这对encodeURIComponent返回的内容产生了任何影响。我可以改变GET查询返回的内容。 This is your original page,提交的网址如下:

test-get-vs-encodeuri.html?one=Euro-%80

This is a UTF-8 version of the page,提交的网址如下所示(在Firefox中):

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-€

但如果我复制并粘贴它,我会得到:

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-%E2%82%AC

所以看起来如果页面是UTF-8,那么GET和encodeURIComponent匹配。