关于URL编码

基本概念

1.encodeComponent编码url,url不能直接使用,须要编码php

var rlt = "http://service.weibo.com/share/share.php?";
var url = 'http://www.baidu.com';
var params = {
    appkey: "379570494",
    title: "领杉果红包,享更多优惠!点击领取:",
    url: url
};
for (var i in params) {
    rlt += i + '=' + params[i] + '&';
}
for (var i in params) {
    rlt += i + '=' + encodeURIComponent(params[i]) + '&';
}
console.log(rlt);

问题的由来

1.URL就是网址,只要上网,就必定会用到.
只有字母和数字[0-9a-zA-Z],一些特殊符号$-_.+!*'(),以及某些保留字,才能够不通过编码直接用于URL.
2.这意味着,若是URL中有汉字,就必须编码后使用,可是麻烦的是,RFC1738没有规定具体的编码方法,
而是交给应用程序(浏览器)本身决定,这致使'URL编码'成为了一个混乱的领域.
3.包括:ajax请求url地址,浏览器上直接用get或post发出http请求,网址路径中包含汉字,查询字符串包含汉字.
4.使用js先对URL编码,而后再向服务器提交,不给浏览器插手的机会,
由于js的输出老是一致的,因此就保证了服务器获得的数据是格式统一的.ajax

escape,unescape

escape()不能直接用于URL编码,他的真正做用是返回一个字符串的Unicode编码值.浏览器

encodeURI和decodeURI

1.encodeURI()是js中真正用来对URL编码的函数
2.它着眼于对整个URL进行编码,所以除了常见的符号之外,对其余一些在网址中有特殊含义的符号;/?:@&=+$,#也不进行编码,
编码后,它输出符号的utf-8形式,而且在每一个字节前加上%服务器

encodeURIComponent和decodeURIComponent

与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码.
所以,;/?:@&=+$,#这些在encodeURI()中不被编码的符号,在encodeURIComponent中通通会被编码.app

var test = 'http://www.baidu.com/my app?search=a&b=3#2哈哈';
var test1 = encodeURIComponent(test);
var test2 = encodeURI(test);
console.log(test);  // http://www.baidu.com
console.log(test1); // http%3A%2F%2Fwww.baidu.com%2Fmy%20app%3Fsearch%3Da%26b%3D3%232%E5%93%88%E5%93%88,浏览器没法解析这个地址
console.log(test2); // http://www.baidu.com/my%20app?search=a&b=3#2%E5%93%88%E5%93%88,浏览器没法解析这个地址

var test3 = decodeURIComponent(test1);
var test4 = decodeURI(test2);
console.log(test3);
console.log(test4);

var test5 = escape(test);
var test6 = unescape(test5);
console.log(test5); // http%3A//www.baidu.com/my%20app%3Fsearch%3Da%26b%3D3%232%u54C8%u54C8
console.log(test6); // http://www.baidu.com/my app?search=a&b=3#2哈哈