escape
, encodeURI
, encodeURIComponent
是JavaScript内置的三个编码函数,
与之对应的解码函数分别为unescape
, decodeURI
, decodeURIComponent
.
它们有什么区别与联系呢?
escape/unescape
这一对函数是建议不要使用的, 大家可以去w3c或者MDN自己去看, 至于为什么, 不是很清楚.
对 ASCII码而言(以下如未特殊说明,均指ASCII码范围),escape不编码的字符有69个 这可以通过如下代码来得出:
function notEncode(encodeMethod) {
var arr = [];
for (var i = 0; i < 256; i++) {
var char = String.fromCharCode(i);
if (char === encodeMethod(char)) {
arr.push({
character: char,
escape: encodeMethod(char)
});
}
}
return arr;
}
// 以表格的形式打出来, 方便观看
console.table(notEncode(escape));
结果如下图(部分截图):
而对于ASCII以外的字符,则会以%u + 十六进制数
的形式来表示,如:
// "%u4E2D"
escape('中')
这一点在MDN中也有提及, 建议大家要查阅api都可以去MDN.
unescape就是用来解escape编码后的字符串的,但是也建议不要使用,
可以用decodeURI或者decodeURIComponent来代替.
知道了上述技巧, 那么我们可以轻松地知道, encodeURI不编码的字符有82个, encodeURIComponent不编码的字符有71个,
可以通过上述提供的函数来查看.
notice
实际中我们可能并不关心它们不编码的字符具体有哪些, 而是应用场景.
比如经常要对地址, 用户传递的参数(表单等)进行编码处理, 那么具体场景应该使用哪个函数呢?
之前我一直记得是, 参数编码就用encodeURIComponent, 对于URL地址, 不要协议+主机部分, 只用encodeURIComponent编其余部分, 其实这并不太对.
一般对于整个地址编码, 应该使用encodeURI, 对于参数(比如拼接地址时), 应该使用encodeURIComponent编.
比如:
var url = 'http://www.example.com/test space.html ';
// http://www.example.com/test%20space.html%20
var url_encodeURI = encodeURI(url);
// http%3A%2F%2Fwww.example.com%2Ftest%20space.html%20
var url_encodeURIComponent = encodeURIComponent(url);
由上述代码可见, encodeURIComponent会将/
符号也进行编码, 这样编码后的地址就会访问失效.
对于参数的情况, 不再举例, 可参考这篇问答.
欢迎批评补充.