【问题标题】:What is the difference between decodeURIComponent and decodeURI?decodeURIComponent 和 decodeURI 有什么区别?
【发布时间】:2009-04-14 13:48:19
【问题描述】:

JavaScript 函数 decodeURIComponentdecodeURI 有什么区别?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    为了解释这两者之间的区别,让我解释一下encodeURIencodeURIComponent之间的区别。

    主要区别在于:

    • encodeURI 函数旨在用于完整的 URI。
    • encodeURIComponent 函数旨在用于 .. 好 .. URI 组件,即 位于分隔符 (; / ? : @ & = + $ , #) 之间的任何部分。

    因此,在encodeURIComponent 中,这些分隔符也被编码,因为它们被视为文本而不是特殊字符。

    现在回到解码函数之间的区别,每个函数解码由其对应的编码对应物生成的字符串,并处理特殊字符的语义及其处理。

    【讨论】:

    • 另一个重要区别是 unescape 不处理多字节 UTF-8 序列,而 decodeURI[Component] 处理:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
    • 恕我直言,举一些例子会很有用
    • 请注意decodeURI("%C3%A9") == "é"。除非您有特定原因不允许编码application/x-www-form-urlencoded,否则decodeURI() 将是最佳选择,因为浏览器通常以application/x-www-form-urlencoded 发送数据。最常见的区别是处理+
    • 应该可以使用encodeURIComponent() 处理所有内容,但始终使用decodeURI() 进行解码。对于encodeURIComponent() 的输出,使用decodeURI()decodeURIComponent() 都没有关系。如果您需要处理浏览器发出的查询字符串,正确解析可能需要使用decodeURI() 而不是decodeURIComponent()
    【解决方案2】:

    encodeURIComponent/decodeURIComponent() 几乎总是您想要使用的对,用于连接在一起并拆分 URI 部分中的文本字符串。

    encodeURI 不太常见,而且名称有误导性:它实际上应该称为 fixBrokenURI。它需要一些几乎是 URI,但其中包含无效字符(如空格)的内容,并将其转换为真正的 URI。它可以有效地修复来自用户输入的无效 URI,它还可以用于将 IRI(带有裸 Unicode 字符的 URI)转换为纯 URI(使用 %-转义的 UTF-8 来编码非 ASCII )。

    encodeURI 应该真正命名为 fixBrokenURI(),decodeURI() 也可以同样命名为潜在的BreakMyPreviousWorkingURI()。我想不出它在任何地方的有效用途;避免。

    【讨论】:

    • decodeURI(encodeURI('%20')) 在 IE、chrome 和 firefox 中正确给出了 '%20',只是想知道您从哪个浏览器/版本中观察到的错误结果?
    • 可能在 2009 年就被破坏了,但同时现代浏览器赶上了(我的猜测)。
    【解决方案3】:
    js> s = "http://www.example.com/string with + and ? and & and spaces";
    http://www.example.com/string with + and ? and & and spaces
    js> encodeURI(s)
    http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
    js> encodeURIComponent(s)
    http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces
    

    看起来encodeURI 通过编码空格和其他一些(例如不可打印的)字符来生成“安全”URI,而encodeURIComponent 还对冒号、斜杠和加号字符进行编码,并且旨在用于查询字符串。 + 和 ? 的编码和 & 在这里特别重要,因为它们是查询字符串中的特殊字符。

    【讨论】:

      【解决方案4】:

      由于我有同样的问题,但在这里没有找到答案,所以我做了一些测试以找出实际的区别。 我这样做了,因为我需要一些与 URL/URI 无关的编码。

      • encodeURIComponent("A") 返回“A”,它不会将“A”编码为“%41”
      • decodeURIComponent("%41") 返回“A”。
      • encodeURI("A") 返回“A”,它不会将“A”编码为“%41”
      • decodeURI("%41") 返回“A”。

      -这意味着两者都可以解码字母数字字符,即使它们没有编码它们。不过……

      • encodeURIComponent("&") 返回“%26”。
      • decodeURIComponent("%26") 返回“&”。
      • encodeURI("&") 返回“&”。
      • decodeURI("%26") 返回“%26”。

      尽管 encodeURIComponent 不编码所有字符,但 decodeURIComponent 可以解码 %00 到 %7F 之间的任何值。

      注意:如果您尝试解码 %7F 以上的值(除非它是 unicode 值),那么您的脚本将失败并出现“URI 错误”。

      【讨论】:

      • 注意:第一个 decodeURIComponent 中有一个错字(m 而不是 n)。我无法更正它,因为我必须编辑至少 6 个字符。
      • 换句话说,如果解码的字节不构成有效的 UTF-8 序列,解码函数将抛出异常。一旦超过 %7F,就会进入多字节序列。因此,例如 %D0%B0 有效,但 %80 无效。
      【解决方案5】:

      encodeURIComponent()

      将输入转换为 URL 编码的 字符串

      encodeURI()

      对输入进行 URL 编码,但是 假设给出了一个完整的 URL,所以 通过不编码返回一个有效的 URL 协议(例如 http://)和 主机名(例如 www.stackoverflow.com)。

      decodeURIComponent()decodeURI() 与上述相反

      【讨论】:

        【解决方案6】:

        decodeURIComponent 将解码 URI 特殊标记,例如 &、?、# 等,decodeURI 不会。

        【讨论】:

          【解决方案7】:

          编码URI组件 未转义:

          A-Z a-z 0-9 - _ . ! ~ * ' ( )
          

          编码URI() 未转义:

          A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
          

          https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

          https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

          【讨论】:

            【解决方案8】:

            encodeURI() 函数不对 URI 具有特殊含义的字符(保留字符)进行编码。

            【讨论】:

              猜你喜欢
              • 2015-05-07
              • 2010-10-02
              • 2011-12-12
              • 2010-09-16
              • 2012-03-14
              • 2012-02-06
              • 2011-02-25
              • 2011-11-22
              • 2015-03-26
              相关资源
              最近更新 更多