在向服务器执行http-get请求时,我仍然不明白使用JS函数encodeURIcomponent编码http-get 的每个组件的优点是什么。
进行一些测试我看到服务器(使用PHP)在不使用encodeURIcomponent时也能正确获取http-get请求的值! 显然我仍然需要在客户端级别编码特殊字符& ? = /:否则像“和平&爱情=美德”这样的http-get值将被视为http-get请求的新键值对而不是单个值。 但是为什么encodeURIcompenent还会编码许多其他字符,例如'è',它被翻译成%C3%A8,必须使用utf8_decode函数在PHP服务器上解码。
通过使用encodeURIcomponent,http-get请求的所有值都是utf8编码的,因此当在PHP中获取它时,我必须每次在每个$ _GET值上调用utf8_decode函数非常烦人。
为什么我们不能只编码& ? = /:字符?
另见:JS encodeURIComponent result different from the one created by FORM 它表明encodeURIComponent甚至没有正确编码,因为简单的浏览器FORM GET以不同的方式编码像'€'这样的字符。所以我仍然想知道这个encodeURIComponent是什么用的?
答案 0 :(得分:7)
那是因为
统一资源标识符(URI)是 在[RFC3986]中定义为序列 选自有限的人物 该曲目的子集 US-ASCII [ASCII] 字符。
所以不支持官方unicode; see the RFC了解详情。所有现代浏览器都支持它,这就是为什么你得到你的结果就好了...但是对于奇怪的情况,一些不支持它的浏览器或系统你编码它并确保它在所有符合标准的浏览器中都能正常工作。
答案 1 :(得分:5)
这是一个字符编码问题(again)。正如Gaby所说,URI是一系列ASCII字符(因此只有0-127范围内的字节)。因此,任何其他不是ASCII的字符都需要使用Percent-Encoding进行编码。
由于UTF-8是新的“通用字符编码”,现在用户代理将URI解释为UTF-8编码。但是这些UTF-8编码的单词本身也使用Percent-Encoding编码,因为URI除了ASCII中的字符外不能包含任何其他字符。
这意味着,当您在浏览器的地址字段中输入http://en.wikipedia.org/wiki/€
时,浏览器会查找€
(0xE282AC)的UTF-8代码,并在其上应用百分比编码({{1 }})。因此%E2%82%AC
实际上会产生http://en.wikipedia.org/wiki/€
。
要向您显示这是真的,只需在地址栏中输入http://en.wikipedia.org/wiki/%E2%82%AC
,您的浏览器就可能会将其转换为http://en.wikipedia.org/wiki/%E2%82%AC
。这是因为现在用户代理将URI解释为UTF-8编码。
现在回到最初的问题,为什么你应该明确地应用Percent-Encoding:想象一下,你有一个网页,你想要链接到欧元符号上的维基百科文章。如果您只使用普通http://en.wikipedia.org/wiki/€
编写URI:
€
您的浏览器将使用文档的字符编码作为<a href="http://en.wikipedia.org/wiki/€">Euro sign</a>
字符。这意味着,如果您的文档编码是Windows-1252(如your other question中所述),则€
将编码为0x80,URI将为€
(这实际上有效,因为维基百科是聪明地猜测,因为Windows-1252是最受欢迎的字符编码,在0x80上具有可打印字符。
但是如果您的文档的编码是ISO 8859-15,则http://en.wikipedia.org/wiki/%80
将被编码为0xA4,代表ISO 8859-1中的currency sign ¤
(维基百科将选择ISO 8859-1,因为0xA4是UTF-8和HTTP specifies ISO 8859-1 as default character encoding)中的无效字节序列。
所以我建议始终使用Percent-Encoding来避免错误。不要让用户代理猜出你的意思。