Javascript JS encodeURIComponent结果与表单创建的结果不同

Javascript JS encodeURIComponent结果与表单创建的结果不同,javascript,urlencode,url-encoding,encodeuricomponent,Javascript,Urlencode,Url Encoding,Encodeuricomponent,我认为表单中输入的值是由浏览器正确编码的 但是这个简单的测试文件“test\u get\u vs\u 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" con

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

但是这个简单的测试文件“test\u get\u vs\u 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>

点击提交按钮时:

encodeuricompent将输入值编码为“欧元-%E2%82%AC”

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

  • 有人能解释一下吗

  • 如何使用Javascript以与borwser表单(windows-1252)相同的方式对所有内容进行编码?(转义函数不起作用,编码器组件也不起作用)


  • 或者encodeURIComponent正在进行不必要的转换?

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


    (来源:)

    这与您从encodeURIComponent获得的内容非常相似。然而,我找不到任何编码组合对encodeURIComponent返回的内容有任何影响。我可以改变GET查询返回的内容,提交时会出现如下URL:

    test-get-vs-encodeuri.html?one=Euro-%80
    
    ,提交时给出的URL如下所示(在Firefox中):

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

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

    因此,如果页面是UTF-8,则GET和encodeuri组件匹配。

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


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

    @Gumbo:谢谢,我现在明白了。但这让我想到了我已经问过的另一个问题,这个该死的组件有什么用?我的意思是,即使我使用cp1252,表单编码的值也不会错,那么为什么我要使用这个该死的Encodeuri组件来编码URI,我不能只使用一个简单的JS escape函数,返回与表单编码的值相同的值。我知道这可能不好,但最后我更喜欢像浏览器的表单那样编码@马可·德米奥:
    escape
    有不同的格式:
    escape(“€”)==%u20AC“
    。至于
    encodeURIComponent
    :假设您想要构建一个包含
    &
    作为值的URI(比如
    bar&baz
    “…?foo=bar&baz”
    将产生两个参数(foo和baz),因为
    &
    是一个特殊字符。但是,
    “…?foo=“+encodeURIComponent(“bar&baz”)
    可以。对不起,我没有正确解释,我说的都是废话,我知道我必须在GET组件中编码字符'&',但是我如何使用JS以与cp1252相同的方式编码所有内容?使用escape不是方法,但是使用EncodeUriComponent也不是方法,因为欧元的编码不同。JS中有什么函数可以做到这一点吗?很抱歉,我也更新了问题。@Marco Demaio:由于
    encodeURIComponent
    希望字符串是UTF-8编码的,您需要编写自己的编码函数。encodeURIComponent始终采用UTF-8。From:15.1.3.4 encodeURIComponent(uriComponent)encodeURIComponent函数计算URI的新版本,其中某些字符的每个实例都被一个、两个或三个表示字符UTF-8编码的转义序列替换。
    http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-%E2%82%AC