代码之家  ›  专栏  ›  技术社区  ›  andynormancx

decodeURIComponent vs unescape,unescape有什么问题?

  •  43
  • andynormancx  · 技术社区  · 16 年前

    在回答另一个问题时,我意识到我的Javascript/DOM知识已经有点过时了,因为我仍然在使用它 escape / unescape 对URL组件的内容进行编码,而我现在应该使用 encodeURIComponent decodeURIComponent 相反

    我想知道的是你到底怎么了 / 景观 ? 有一些模糊的建议认为Unicode字符存在某种问题,但我找不到任何明确的解释。

    逃跑 / 而且相关的应用程序已经完全支持Unicode很多年了。

    那么Unicode的问题是什么呢 / 景观 你应该有吗?有人有任何测试用例来证明问题吗?

    4 回复  |  直到 16 年前
        1
  •  44
  •   bobince    16 年前

    它们本身并没有错,它们只是它们自己的特殊字符串格式,看起来有点像URI参数编码,但实际上不是。特别地:

    • +意思是加号,不是空格
    • 有一种特殊的%unnn格式用于编码Unicode UTF-16代码点,而不是编码UTF-8字节

    因此,如果使用escape()创建URI参数值,则对于包含加号或任何非ASCII字符的字符串,将得到错误的结果。

    utf8bytes= unescape(encodeURIComponent(unicodecharacters));
    unicodecharacters= decodeURIComponent(escape(utf8bytes));
    
        2
  •  11
  •   ecmanaut    12 年前

    escape 仅对0到255(包括0到255)范围内的字符(ISO-8859-1,它实际上是可以用单个字节表示的unicode码点)进行操作。(*)

    encodeURIComponent 适用于javascript可以表示的所有字符串(这是unicode基本多语言平面的整个范围,即unicode代码点0到1114111或0x10FFFF,几乎涵盖了当前使用的任何人类书写系统)。

    这两个函数都生成url安全字符串,该字符串仅使用0到127(US-ASCII)的代码点,后者通过首先将字符串编码为UTF-8,然后应用 %XX 十六进制编码 ,指向任何不安全的代码点。

    这就是为什么你可以 make a two-funcall UTF-8 encoder/decoder unescape decodeURIComponent

    (*)注意:一些现代浏览器,如Google Chrome,已经进行了调整,为上述255个字符范围生成%uxxx转义最初没有定义,但web服务器对解码该编码的支持不如解码基于IETF标准UTF-8的编码。

        3
  •  7
  •   ucefkh    11 年前

    最好的答案是它在这个网站上在线工作 http://meyerweb.com/eric/tools/dencoder/

    function decode() {
        var obj = document.getElementById('dencoder');
        var encoded = obj.value;
        obj.value = decodeURIComponent(encoded.replace(/\+/g,  " "));
    }
    
        4
  •  5
  •   sstur    13 年前

    我遇到的另一个“现代”用法是解析可能包含无效UTF8字节序列的URI编码字符串。在某些情况下,组件可能引发异常。您可能需要捕获此异常并退回到使用unescape。

    例如,“tr”编码为“t%FCr”,我见过Firefox生成它(当字符粘贴到地址栏后?)。