在实际项目中遇到了很多与编码有关的问题,现在总结一下
1,URI编码
ES5中新加了encodeURI与encodeURIComponent的方法,encodeURI保留了一些字符,例如请求中参数的&?等,encodeURIComponent只是对URI的一部分进行编码,同样会保留一部分字符,比如空格(建议按照encoded的方法将空格转为人为+),MDN提供的修正方法
function fixedEncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
对应的解码方法
decodeURI,decodeURIComponent
2. escape和unescape
escape将字符串转为对应的16进制转移序列表示的字符串,对应unescape
这两种方法已经被ES标准所抛弃,不过现在的环境还能用
字符的16进制格式值,当该值小于等于0xFF时,用一个2位转移序列: %xx 表示(低八位). 大于的话则使用4位序列:%uxxxx 表示(高八位占有).
把js字符串与utf16转换:单个字符替换
str.codePointAt().toString(16),由于有些字符占了4位,需要用padStart方法来填充;所以完整的转换方法
str.charCodeAt().toString(16).padStart(6, '\\u0000');
//这样不管编码是否大于0XFF的字符都可以转换为16进制的转义字符,而用escape会把小于0XFF直接按照其编码值显示出来,对于大于0xffff的需要判断下,这里不做讨论,只需要对长度做下判断即可,以及结合codePointAt
相反的,我们只需要调用unescape(utf-16)就可以了。
3,ES6新增的unicode编码,大括号标识
'\u{73}'//s
'\u{0073}'//s
'\x73'//s
4, base64的转换
dtoa()进行base64转码,atob(base64)解码,其中atob接受的参数的长度必须为4的倍数
扩展
function utoa(str) {
return window.btoa(unescape(encodeURIComponent(str)));
}
// base64 encoded ascii to ucs-2 string
function atou(str) {
return decodeURIComponent(escape(window.atob(str)));
}