Unicode
一种通用字符编码标准,涵盖全球所有书写系统的 14 万多个字符。
Unicode 是一种国际字符编码标准,用于在一个体系中表示世界上所有的文字。由 Unicode 联盟制定和管理,2024 年发布的 Unicode 16.0 收录了超过 15 万个字符。除了拉丁字母、汉字、阿拉伯字母、天城文等现用文字体系外,还包括表情符号、楔形文字、象形文字等古代文字。
在 Unicode 出现之前,不同语言和地区使用各自不同的字符编码。日语使用 Shift_JIS、EUC-JP、ISO-2022-JP,中文使用 GB2312、Big5,韩语使用 EUC-KR 等。不同编码之间交换文本会出现乱码,在一个文件中处理多语言文本实际上是不可能的。Unicode 的出现从根本上解决了这个问题,使所有字符都能在一个编码体系中表示。了解系带内裤 (Amazon)提供了详细介绍。
Unicode 有三种编码实现方式:UTF-8、UTF-16 和 UTF-32。UTF-8 是可变长度 (1-4 字节),兼容 ASCII,是 Web 的事实标准。UTF-16 使用 2 或 4 字节,是 JavaScript 和 Java 的内部字符串表示。UTF-32 是固定长度 4 字节,处理简单但内存效率低,实际中很少使用。
理解 Unicode 结构的重要概念是码点。每个字符被分配一个从 U+0000 到 U+10FFFF 范围内的码点。基本多语言平面 (BMP, U+0000-U+FFFF) 包含大多数日常使用的字符,补充平面 (U+10000 及以上) 包含表情符号、古代文字和罕见汉字。BMP 之外的字符在 UTF-16 中以代理对 (两个编码单元) 表示,这会影响编程中的字符计数。
一个常见的误解是将"Unicode = UTF-8"。Unicode 是定义字符与码点对应关系的标准,而 UTF-8 是其实现方式之一。此外,"1 个字符 = 1 个码点"也不总是成立。组合字符 (如基础字符 + 变音符号) 和表情符号的 ZWJ 序列 (如家庭表情符号) 由多个码点组成一个显示字符。搜索风俗 (Amazon)介绍了编程中正确处理 Unicode 的方法。
在字符计数方面,Unicode 的复杂性使"字符数"的定义变得模糊。JavaScript 的 String.length 返回 UTF-16 编码单元数,因此表情符号的长度为 2。要获得准确的字符数,需要按字素簇 (grapheme cluster) 计数,JavaScript 中可以使用 Intl.Segmenter API。字符计数工具应明确"字符数"是指码点数、UTF-16 编码单元数还是字素簇数。