在向服务器执行 http-get 请求时我仍然不明白的是 使用JS函数encodeURIComponent对http-get的每个组件进行编码有什么好处.

做了一些测试我看到了 如果我不使用encodeURIComponent,服务器(使用PHP)也会正确获取http-get请求的值!显然我仍然需要在客户端级别对特殊字符 & 进行编码?= / :否则,像“peace&love=virtue”这样的 http-get 值将被视为 http-get 请求的新键值对,而不是单个值。但是为什么encodeURIcompenent还编码许多其他字符,例如'è',它被翻译成%C3%A8,必须使用utf8_decode函数在PHP服务器上解码。

通过使用encodeURIComponent,http-get请求的所有值都是utf8编码的,因此当在PHP中获取它们时,我必须每次对每个$_GET值调用utf8_decode函数 很烦人.

为什么我们不能只编码 & ?= / :人物?

也可以看看: JSencodeURIComponent结果与FORM创建的结果不同它表明,encodeURIComponent 甚至无法正确编码,因为简单的浏览器 FORM GET 以不同的方式对“€”等字符进行编码。所以我仍然想知道这个encodeURIComponent是做什么用的?

有帮助吗?

解决方案

这是一个字符编码问题(再次)。正如 Gaby 所说,URI 是 ASCII 字符序列(因此只有 0-127 范围内的字节)。因此,任何其他非 ASCII 字符都需要使用 百分比编码.

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

这意味着,当您输入 http://en.wikipedia.org/wiki/€ 输入浏览器的地址字段,浏览器会查找 UTF-8 代码 (0xE282AC)并对其应用百分比编码(%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(如 你的另一个问题), 这 将被编码为 0x80 并且 URI 将是 http://en.wikipedia.org/wiki/%80 (这实际上是有效的,因为维基百科很聪明地猜测,因为 Windows-1252 是最流行的字符编码,在 0x80 上有可打印字符)。

但如果您的文档的编码是 ISO 8859-15,则 将被编码为 0xA4,代表 货币符号 ¤ 在 ISO 8859-1 中(维基百科将选择 ISO 8859-1,因为 0xA4 是 UTF-8 中的无效字节序列,并且 HTTP 指定 ISO 8859-1 作为默认字符编码).

所以我建议 始终使用百分比编码以避免错误. 。不要让用户代理猜测您的意思。

其他提示

这是因为

  

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

正式所以Unicode是不支持; 详见RFC 。所有现代浏览器都支持它,虽然,这就是为什么你得到你的结果就好了..但对于其中一些浏览器或系统不支持它,你编码,并确保奇数情况下,在所有标准兼容的浏览器工作正常..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top