字符的Unicode表示法
JavaScript允许采用\uxxxx
表示一个字符,其中xxxx表示字符的码点。
console.log("\u0061");
//a
但是这种表示法只限于\u0000 -- \uFFFF
之间的字符。超出这个范围的字符,必须用双字节表示法表达
console.log("\uD842\uDFB7");
//𠮷
上面代码表示,如果在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript就会理解成\u20BB+7,由于\u20BB是一个不可打印字符,所以会显示一个空格,后面跟一个7(₻7)
ES6对这点做了改进,只要将码点放入大括号,就能正确解读该字符
console.log("\u{20BB7}");//𠮷
JavaScript 方法表示一个字符
- ‘\z’ === ‘z’ //true
- ‘\172’ === ‘z’ //true
- ‘\x7A’ === ‘z’ //true
- ‘\u007A’ === ‘z’ //true
- ‘\u{7A}’ === ‘z’ //true
codePointAt()
JavaScript内部,字符以UTF-16的格式存储,每个字符固定为2字节,对于那些需要4个字节存储的字符(码点大于0xFFFF的字符),JavaScript会认为他们是两个字节。
“𠮷”字码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节存储。对于4个字节的字符,JavaScript不能正确处理,字符串长度就会误判长度为2,而且charAt方法无法读取整个字符,charCodeAt方法只能返回前2个字节和后2个字节的值。
ES6提供的codePointAt()方法,能够正确处理4个字节存储的字符,返回一个字符的码点。
var str = "𠮷a"
console.log(str.charCodeAt(0));
console.log(str.charCodeAt(1));
console.log(str.codePointAt(0));
console.log(str.codePointAt(1));
console.log(str.codePointAt(2));
//55362
//57271
//134071
//57271
//97
codePointAt()检测一个字符占用的编码单元数量
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
console.log(is32Bit('𠮷'));
console.log(is32Bit('a'));
//true
//false
String.fromCodePoint()
String.fromCodePoint()方法根据指定的码位生成一个字符。
console.log(String.fromCodePoint(134071));//𠮷
normalize()
ES6为字符串实例化提供了normalize方法,用来将两个字符的不同表示方法统一为同样的形式,称为Unicode正规化。
console.log('\u01D1'.normalize() === '\u004F\u030c'.normalize());
//true
normalize接受4个参数
- NFC 标准等价合成
- NFD 标准等价分解
- NFKC 兼容等价合成
- NFKD 兼容等价分解
在对比字符串之前,一定要把它们标准化为同一形式