ES6之Unicode支持

37 阅读1分钟

ES6之Unicode支持

当我们在使用一些汉字时,会出现一些我们意想不到的问题,比如这个例子:

const text='𠮷'
console.log('字符串的长度:',text.length) //2
console.log('是否满足正则表达式:',/^.$/.test(text)) //false

为什么会出现这种情况呢?字符的长度怎么是2
原来也算是一个历史遗留问题。在互联网刚开始的时候,内存资源非常的宝贵。于是当时在进行字符编码的时候使用了16位的字符编码,这就是我们熟知的 Unicode。等到后来的时候,Unicode又进行了一次扩充,将部分字符增加到了32位,这就足以包括所有的字符。汉字也是32位。
但在ES6内部,依然采用了原始的做法,ES6采用码元(16位)作为一个单位,所以像有些汉字就会出现两个长度的情况。我们可以通过charCodeAt来查看。

const text='𠮷'
console.log('第一个码元:',text.charCodeAt(0))
console.log('第二个码元:',text.charCodeAt(1))

而我们所说的一个字的长度实际上叫做码点,一个码点有可能会包括两个码元。比如:

console.log('第一个码点:',text.codePointAt(0))
console.log('第二个码点:',text.codePointAt(1))

第一个码点会自动连接第二个码元。这是ES6为我们做的优化。通过codePointAt可以很方便地查找一个字符的码点。同时,正则表达式也通过将 flag 配置为 u 的方式,使得可以根据码点匹配正则表达式。