2010-02-10 95 views
3

执行http-get请求到服务器时,我仍然不明白的是使用JS函数encodeURIcomponent对http-get的每个组件进行编码的优点是什么encodeURIComponent真的很有用吗?

做了一些测试我看到服务器(使用PHP)也可以正确获取http-get请求的值,如果我不使用encodeURIcomponent! 显然我仍然需要在客户端编码特殊字符&? = /:否则,像这样的“和平&爱=美德”的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方法甚至不正确编码,因为一个简单的浏览器表单GET编码像“€”字,以不同的方式。所以我仍然想知道这个encodeURIComponent是为了什么?

回答

5

这是一个字符编码问题(again)。正如Gaby所说,URI是一系列ASCII字符(因此只有0-127范围内的字节)。因此,任何其他字符(不是ASCII码)都需要使用Percent-Encoding进行编码。

而且由于UTF-8是新的“通用字符编码”,现在用户代理将URI解释为UTF-8编码。但是这些UTF-8编码的字本身也使用百分比编码进行编码,因为URI不能包含除ASCII以外的任何其他字符。

这意味着,当你进入http://en.wikipedia.org/wiki/€到浏览器的地址栏中,您的浏览器查找了(0xE282AC)的UTF-8编码,并在其上(%E2%82%AC)适用百分比编码。所以http://en.wikipedia.org/wiki/€实际上会导致http://en.wikipedia.org/wiki/%E2%82%AC

为了向您说明这是真的,只需在您的地址栏中输入http://en.wikipedia.org/wiki/%E2%82%AC,您的浏览器可能会将其转换为http://en.wikipedia.org/wiki/€。这是因为现在用户代理将URI解释为UTF-8编码。

回到最初的问题,为什么你应该明确地应用百分比编码:想象一下,你有一个网页,你想链接到欧元符号上的维基百科文章。如果你只写了URI与普通

<a href="http://en.wikipedia.org/wiki/€">Euro sign</a> 

您的浏览器将使用该文件的字符编码字符。这意味着,如果您的文档的编码是Windows-1252(如your other question),则将编码为0x80,并且URI将为http://en.wikipedia.org/wiki/%80(这实际上起作用,因为维基百科很聪明,因为Windows-1252是最受欢迎的字符使用0x80上的可打印字符进行编码)。

但是如果你的文档的编码是ISO 8859-15的将被编码为0xA4表示在ISO 8859-1的currency sign ¤(维基百科将选择ISO 8859-1,因为0xA4是UTF-8无效字节序列和HTTP specifies ISO 8859-1 as default character encoding)。

所以我建议总是使用Percent-Encoding来避免错误。不要让用户代理猜测你的意思。

7

这是因为

统一资源标识符(URI)是在[RFC3986]定义为一个序列从 US-ASCII的剧目的有限 子集选择的字符 [ASCII ]个字符。

所以不支持官方unicode; see the RFC了解详情。所有的现代浏览器都支持它,这就是为什么你会得到你的结果很好......但对于某些浏览器或系统不支持它的奇怪情况,你需要对它进行编码,并确保它在所有符合标准的浏览器中都能正常工作。

+0

那么你基本上是说现在几天我可以避免使用encodeUriCompenent?只需编码特殊字符:'&','?','=','/',':'。这基本上适用于现在的绝大多数浏览器。 – 2010-02-11 14:31:04

+0

它可以在大多数浏览器中工作..但请记住,网址也发布在论坛/博客/等等..如果该论坛/博客/等不是在Unicode中的网址(据说链接到您的网站)可能会搞砸了.. – 2010-02-11 14:43:55