字符串与编码

在实际项目中遇到了很多与编码有关的问题,现在总结一下

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)));
}

 

你可能感兴趣的:(JavaScript)