String字符串编码知识点笔记

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
喜欢就支持一下吧
点赞0 分享