decodeURIComponent vs unescape,unescape有什么问题?
在回答另一个问题时,我意识到我的Javascript / DOM知识已经过时了,因为我仍然使用escape
/ unescape
来编码URL组件的内容,而现在我应该使用encodeURIComponent
/ decodeURIComponent
。
我想知道的是escape
/ unescape
有什么问题? 有一些模糊的build议,说Unicode字符有一些问题,但我找不到任何明确的解释。
我的networking经验是相当有偏见的,几乎所有这一切都写了与Internet Explorer绑定的大型Intranet应用程序。 这已经涉及了很多escape
/ unescape
的使用,涉及的应用程序已经完全支持Unicode多年了。
那么escape
/ unescape
应该有哪些Unicode问题? 有没有人有任何testing案例来展示问题?
我想知道的是escape / unescape有什么问题?
它们不是“错误的”,它们只是它们自己特殊的string格式,看起来有点像URI参数编码,但实际上不是。 尤其是:
- “+”意味着加号,而不是空格
- 有一种特殊的“%uNNNN”格式用于编码Unicode UTF-16码点,而不是编码UTF-8字节
所以如果使用escape()来创buildURI参数值,那么对于包含一个加号的string或任何非ASCII字符,您将得到错误的结果。
escape()可以用作内部的仅限于JavaScript的编码scheme,例如用于转义cookie值。 然而,现在所有的浏览器都支持encodeURIComponent(本来不是这种情况),没有理由优先使用escape。
我所知道的escape / unescape只有一个现代用法,那就是通过利用URIComponent中的UTF-8处理来实现UTF-8编码器/解码器的快速方法:
utf8bytes= unescape(encodeURIComponent(unicodecharacters)); unicodecharacters= decodeURIComponent(escape(utf8bytes));
escape
仅对范围在0到255之间的字符(ISO-8859-1,这实际上是用一个字节表示的unicode代码点)进行操作。 (*)
encodeURIComponent
适用于所有stringjavascript可以表示(这是unicode的基本多语言平面的全部范围,即unicode代码点0到1,114,111或0x10FFFF,几乎覆盖了当前使用的任何人类书写系统)。
这两个函数都生成只使用代码点0到127(US-ASCII)的url安全string,后者通过首先将string编码为UTF-8,然后将从escape
的%XX
hex编码应用到任何代码点这不会是url安全的。
这是偶然的,为什么你可以在没有任何循环或垃圾产生的情况下,通过组合这些原语来取消除UTF-8处理的所有副作用以外,还可以在javascript中创build一个双通道的UTF-8编码器/解码器 ,就像unescape
和decodeURIComponent
版本反过来也一样。
(*)脚注:一些现代的浏览器,如谷歌浏览器,已经调整为产生%uXXXX字符以上的字符逃生最初并没有定义,但解码该编码的networking服务器支持不如解码IETF标准的基于UTF-8的编码。
最好的答案是这是它在这个网站在线工作http://meyerweb.com/eric/tools/dencoder/
function decode() { var obj = document.getElementById('dencoder'); var encoded = obj.value; obj.value = decodeURIComponent(encoded.replace(/\+/g, " ")); }
我遇到的另一个“现代”用法是parsing可能包含无效的UTF8字节序列的URI编码的string。 在某些情况下,decodeURIComponent可能会引发exception。 您可能需要赶上这个例外,并回到使用unescape。
一个例子是'tür'编码为't%FCr',这是我见过的Firefox产生的(当字符被粘贴到地址栏后?)。