ES6 中的 Unicode 码点详解

Unicode 是一种全球通用的字符编码标准,Unicode 编码了各种语言和符号的字符,Unicode 总共可以表示 1,114,112 个字符,因此它可以用来支持所有语言的文字,包括中文、日文、韩文、阿拉伯文等。而在ES6中,Unicode 码点也得到了很大的改进和进化,本文将深入探讨 ES6 中的 Unicode 码点。

什么是 Unicode 码点?

在计算机中,所有的字符都有一个固定的数字编号,这个数字就是字符的码点。Unicode 码点是 Unicode 中每个字符所对应的唯一编码,它是一个四至八位十六进制数。例如,拉丁字母 A 的 Unicode 码点为 U+0041,中文“中国”的码点为 U+4E2D U+56FD。

在 ES6 之前,JavaScript 中的字符串包含的码点只能使用 Unicode BMP(Basic Multilingual Plane,基本多文种平面)中的字符,即 Unicode 码点从 U+0000 到 U+FFFF。而 ES6 则支持 Unicode 扩展平面中的字符,即 U+10000 到 U+10FFFF 的码点。

Unicode 扩展平面

Unicode 扩展平面指的是 Unicode 中除去 BMP 外的一部分字符所在的平面。BMP 平面中的字符都是用一个 16 位(2 字节)的数字来表示的,范围是 U+0000 到 U+FFFF。而扩展平面中的字符则需要使用两个 16 位(4 字节)的数字来表示,范围是 U+10000 到 U+10FFFF。

在 ES6 中,可以使用两个 \u 来表示扩展平面中的字符,例如:

上述代码将输出一个中文字符,“𠮷”。

字符串的遍历和识别

在 ES6 中,字符串对象也新增了一些方法和属性,以方便我们遍历和识别字符串中的字符,例如:

1. codePointAt()

codePointAt() 方法返回指定位置的字符的 Unicode 码点,如果该字符是扩展字符,则返回两个字节表示的码点,它可以正确处理四字节的 UTF-16 字符。

例如:

let str = '𠮷abc';
console.log(str.codePointAt(0)); // 134071,第一个字符的码点
console.log(str.codePointAt(1)); // 57271,第二个字符的码点的高位
console.log(str.codePointAt(2)); // 57271,第二个字符的码点的低位
console.log(str.codePointAt(3)); // 97,第三个字符的码点

此时会返回中文字符“𠮷”的码点 134071,第二个字符的码点是在第一个字符切分开时,高16位的码值 0xD842 和低16位的码值 0xDFB7 。

2. String.fromCodePoint()

String.fromCodePoint() 静态方法返回 Unicode 码点参数所代表的字符,它可以正确返回四字节的 UTF-16 字符。

例如:

console.log(String.fromCodePoint(0x1F600)); // 😀

3. String.prototype.normalize()

normalize() 方法会将字符的不同表示方法统一成同样的形式,即对于同一个字符,可以用不同的 Unicode 码点表示。normalize() 方法接受一个可选参数,用于指定使用哪种方式来实现统一。

let str = '\u01D1';
console.log(str.normalize()); // Ǒ
console.log(str.normalize('NFKD')); // Ǒ

4. \u{}

在 ES6 中,我们可以使用“大括号和 Unicode 码点”来表示字符,这样可以更直观地看出这个字符的含义和语义:

console.log('\u{20BB7}'); // 𠮷

总结

Unicode 码点是 Unicode 中每个字符所对应的唯一编码。在 ES6 中,它得到了很大的改进和进化,支持 Unicode 扩展平面中的字符。由于扩展字符需要使用两个 16 位(4 字节)的数字来表示,所以在字符串的遍历和识别中要格外小心,需要使用一些新增的方法和属性来处理,例如 codePointAt()String.fromCodePoint()normalize() 等。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a9cd65add4f0e0ff338599


纠错反馈