【问题标题】:encodeURIComponent is really useful?encodeURIComponent 真的有用吗?
【发布时间】:2010-02-10 16:34:11
【问题描述】:

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

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

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

为什么我们不能只编码 & ? = / : 字符?

另见:JS encodeURIComponent result different from the one created by FORM 它表明 encodeURIComponent 甚至没有正确编码,因为简单的浏览器 FORM GET 以不同的方式对像“€”这样的字符进行编码。所以我还是想知道这个 encodeURIComponent 是干什么用的?

【问题讨论】:

    标签: php javascript encodeuricomponent


    【解决方案1】:

    那是因为

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

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

    【讨论】:

    • 所以你基本上是说现在我可以避免使用encodeUriCompenent?并且只需对特殊字符进行编码:'&'、'?'、'='、'/'、':'。这基本上适用于当今的绝大多数浏览器。
    • 它适用于大多数浏览器.. 但请记住,网址也发布在论坛/博客/等中。如果该论坛/博客/等不是 Unicode,则里面的网址(据说链接到您的网站)可能会搞砸..
    【解决方案2】:

    这是一个字符编码问题 (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 代码并对其应用百分比编码 (%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(这实际上是有效的,因为 Wikipedia 很聪明地猜测为 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)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多