一、Unicode编码解码
JavaScript定义了 6 个全局方法用于 Unicode 字符串的编码和解码,说明如表所示。
方法 | 说明 |
---|---|
escape() | 使用转义序列替换某些字符来对字符串进行编码 |
unescape() | 对使用 escape() 编码的字符串进行解码 |
encodeURI() | 通过转义某些字符对 URI 进行编码 |
decodeURI() | 对使用 encodeURI() 方法编码的字符串进行解码 |
encodeURIComponent() | 通过某些转义字符对 URI 的组件进行编码 |
deencodeURIComponent() | 对使用 encodeURIComponent() 方法编码的字符串进行解码 |
escape()和unescape()方法
escape() 方法能够把 ASCII 之外的所有字符转换为 %xx 或 %uxxxx(x表示十六进制的数字)的转义序列。从 \u000 到 \u00ff 的 Unicode 字符由转义序列 %xx 替代,其他所有 Unicode 字符由 %uxxxx 序列替代。
可以使用该方法对 Cookie 字符串进行编码,以避免与其他约定字符发生冲突,因为 Cookie 包含的标点符号是有限制的。
与 escape() 方法对应,unescape() 方法能够对 escape() 编码的字符串进行解码。
var s = "JavaScript 中国";
s = escape(s); //Unicode编码
console.log(s); //返回字符串“JavaScript%u4E2D%u56FD”
s = unescape(s); //Unicode解码
console.log(s); //返回字符串“JavaScript 中国”
这种被解码的代码是不能够直接运行的,我们可以使用 eval() 方法来执行它。
var s = escape('console/log("JavaScript 中国");'); //编码脚本
var s = unescape(s); //解码脚本
eval(s); //执行被解码的脚本
encodeURI() 和 decodeURI() 方法
ECMAScript v3.0 版本推荐使用 encodeURI() 和 encodeURIComponent() 方法代替 escape() 方法,使用 decodeURI() 和decodeURIComponent() 方法代替 unescape() 方法。
encodeURI() 方法能够把 URI 字符串进行转移处理。
encodeURI() 方法与 escape() 方法的编码结果是不同的,但是它们都不会编码 ASCII 字符。
相对而言,encodeURI() 方法更佳安全。它能够将字符转换为 UTF-8 编码字符,然后用十六进制的转义序列(形式为%xx)对生成的 1 字节、2 字节或 4 字节的字符进行编码。
使用 decodeURI() 方法可以对 encodeURI() 方法的结果进行解码。
var s = "JavaScript 中国";
s = encodeURI(s); //URI编码
console.log(s); //返回字符串“JavaScript%E4%B8%AD%E5%9B%BD”
s = decodeURI(s); //URI解码
console.log(s); //返回字符串“JavaScript 中国”
encodeURICompoent() 和 decodeURICompoent()
encodeURICompoent() 与 encodeURI() 方法不同。它们的主要区别在于,encodeURICompoent() 方法假定参数是 URI 的一部分,例如,协议、主机名、路径或查询字符串。因此,它将转义用于分隔 URI 各个部分的标点符号。而 encodeURI() 方法仅把它们视为普通的 ASCII 字符,并没有转换。
下面代码是 URL 字符串被 encodeURICompoent() 方法编码前后的比较。
var s = "c.biancheng.net/navi/search.asp?keyword=URI";
a = encodeURI(s);
console.log(a);
b = encodeURICompoent(s);
console.log(b);
c.biancheng.net/navi/search.asp?keyword=URI
c.biancheng.net%2Fnavi%2Fsearch.asp%3Fkeyword%3DURI
第一行字符串是 encodeURI() 方法编码的结果,第二行字符串是 encodeURICompoent() 方法编码的结果。与 encodeURI() 方法一样,encodeURICompoent() 方法对于 ASCII 字符不编码,用于 分隔 URI 各种组件的标点符号,都由一个或多个十六进制的转义序列替换。
使用 decodeURICompoent() 方法可以对 encodeURICompoent() 方法编码的结果进行解码。
var s = "c.biancheng.net/navi/search.asp?keyword=URI";
b = encodeURICompoent(s);
b = decodeURICompoent(b);
console.log(b);
参考:http://c.biancheng.net/view/5602.html
二、Gzip压缩解压
Gzip解压缩需要用到pako.js,引用方法如下:
<script src="https://cdn.bootcss.com/pako/1.0.6/pako.min.js"></script> 或者 npm install pako
然后封装解压缩方法:
// 解压
function unzip(key) {
// 将二进制字符串转换为字符数组
var charData = key.split('').map(function (x) { return x.charCodeAt(0); });
console.log('压缩后的文件大小:', charData.join(","))
// 将数字数组转换成字节数组
var binData = new Uint8Array(charData);
// 解压
var data = pako.inflate(binData);
// 将GunZip ByTAREAR转换回ASCII字符串
key = String.fromCharCode.apply(null, new Uint16Array(data));
//unescape(str)解压后解码,防止过程中乱码
return unescape(key);
}
// 压缩
function zip(str) {
//escape(str) 压缩前编码,防止过程中乱码
var binaryString = pako.gzip(escape(str), { to: 'string' });
return binaryString;
}
参考:https://blog.csdn.net/qq_35713752/article/details/82079629
三、js字符与ASCII码互转
大写字母A-Z对应的ASCII码值是65-90
小写字母a-z对应的ASCII码值是97-122
将字母转为ascii嘛的方法:
var str = "A";
str.charCodeAt(); // 65
var str1 = 'a';
str1.charCodeAt(); // 97
将ascii码转为对应字母的方法:
var num = 97;
String.fromCharCode(num); // 'a'
var num1 = 100;
String.fromCharCode(num1); // 'd'
参考:https://blog.csdn.net/xiaobing_hope/article/details/78645273
四、Base64编码和解码
Base64 是一种编码方式,可以将任意字符(包括二进制字符流)转成可打印字符。JavaScript 定义了两个与 Base64 相关的全局方法。
- btoa():字符串或二进制值转为 Base64 编码。
- atob():把 Base64 编码转为原来的字符。
Base64 方法不能够操作非 ASCII 字符。
要将非 ASCII 码字符转为 Base64 编码,必须把 Unicode 双字节字符串转换为 ASCII 字符表示,再使用这两个方法。
1. function b64Encode (str) {
2. return btoa(encodeURIComponent(str));
3. }
4. function b64Decode (str) {
5. return decodeURIComponent(atob(str));
6. }
7. var b = b64Encode('[Java](http://c.biancheng.net/java/)Script 从入门到精通');
8. var a = b64Decode(b);
9. console.log(b); //返回SmF2YVNjcmlwdCVFNCVCQiU4RSVFNSU4NSVBNFOSU5NyVBOCVFNSU4OCVCMCVFNyVCMiVCRSVFOSU4MCU5QQ==
10. console.log(a); //返回“JavaScript 从入门到精通”
网友评论