fromCharCode
用指定UTF-16 码点创建字符串,我们来试验一下
String.fromCharCode(65);// A
复制代码
但是它的参数值的范围介于 0 到 65535之间,用16进制来表示就是 0xFFFF,大于这个值的话,最高位将被截断,我们来试验一下
String.fromCharCode(0xF680);// \f680
String.fromCharCode(0x1F680);// \f680
复制代码
可以看到这两个输出都是一样的,如果我就是想用0x1F680怎么办呢?
formCodePoint
ES提供了formCodePoint这个方法,它的参数值范围介于0到1048575,用16进制表示就是0xFFFFF,比fromCharCode多了一个F,来运行一下
String.fromCodePoint(0x1F680);// ?
复制代码
charCodeAt
这个方法是取字符串上指定位置的UTF-16值的,我们来试验一下
'ABC'.charCodeAt(0);// 65
'ABC'.charCodeAt(1);// 66
'ABC'.charCodeAt(2);// 67
复制代码
和fromCharCode对应,charCodeAt也只能取最大值0xFFFF的码点,如果要取超过0xFFFF对应的UTF-16码点需要用到codePointAt
codePointAt
先看一下以下代码
'?'.charCodeAt(0).toString(16);// d83d
'?'.codePointAt(0).toString(16);// 1f680
复制代码
JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节。对于Unicode 码点大于0xFFFF的字符,需要用4个字节来存储,JavaScript 会认为它们是两个字符。
因此呢?的length会被识别为2,如果想获取’?A’中’A’的编码,需要用到’?A’.codePointAt(2)才可以
所以我们要避免这个问题,就不能用for循环来处理of活扩展运算符来处理
let str = '?A';
for (let ch of str) {
console.log(ch.codePointAt(0).toString(16));
}
let arr = [...str];
arr.forEach(
ch => console.log(ch.codePointAt(0).toString(16))
);
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END