UTF-16

UTF-16 是一种 字符编码 标准,用于 Unicode。它使用一个或两个 代码单元 对每个 Unicode 码点 进行编码。每个代码单元是一个 16 位的值。

值小于 216 的码点被编码为单个代码单元,其数值等于码点的值。这些码点组成了基本多语言平面 (BMP),并包含最常见的字符,包括拉丁文、希腊文、西里尔文和许多东亚字符。

例如,拉丁字符“A”在 Unicode 中被分配码点 U+0041,在 UTF-16 中表示为单个代码单元 41

值大于 216 的码点使用一对代码单元进行编码,这被称为代理对。用于代理对的值不用于 Unicode 码点,以避免歧义。

例如,表情符号字符“🦊”(狐狸脸)在 Unicode 中被分配码点 U+1F98A,在 UTF-16 中表示为代理对 d83e dd8a

JavaScript 中的 UTF-16

JavaScript 中的字符串使用 UTF-16 表示,并且许多 String API 操作的是代码单元,而不是码点。例如,对于包含一个不在 BMP 中的单个 Unicode 字符的字符串,String.length 返回 2

js
const string = "🦊"; // U+1F98A
console.log(string.length); // 2

String.charCodeAt() 方法返回给定索引处的代码单元,而 String.codePointAt() 方法返回给定索引处的码点。

js
const string = "🦊"; // U+1F98A

console.log(string.charCodeAt(0).toString(16)); // d83e
console.log(string.charCodeAt(1).toString(16)); // dd8a

console.log(string.codePointAt(0).toString(16)); // 1f98a

要了解更多关于在 JavaScript 中使用 UTF-16 字符串的信息,请参阅 UTF-16 字符、Unicode 码点和字素簇

UTF-16 和 UTF-8

UTF-8 是 Unicode 的另一种编码,它对每个 Unicode 码点使用一到四个字节。UTF-8 在 Web 文档中的使用比 UTF-16 更常见。

UTF-16 和 UCS-2

UCS-2 是一种已过时的 Unicode 编码。它与 UTF-16 相同,但不支持代理对,因此无法编码 BMP 之外的码点。

另见