码位 (Code Point)
Unicode 中为每个字符分配的唯一编号,以 U+ 加十六进制数字表示,如 U+0041 (A)。
码位是 Unicode 标准中为每个字符分配的唯一编号。以 U+ 加十六进制数字表示:U+0041 (拉丁大写字母 A)、U+3042 (平假名 あ)、U+1F600 (笑脸表情)。它是 Unicode 中识别字符的最基本单位,在文本处理的各个环节都会被引用。
Unicode 定义了约 110 万个可能的码位 (0 到 10FFFF),截至 2024 年已分配约 15 万个字符。这个空间被划分为 17 个"平面 (Plane)",第一个平面 (BMP: 基本多语言平面,U+0000 到 U+FFFF) 收录了日常使用的大部分字符。BMP 之外的字符 (表情符号、古文字等) 被放置在辅助平面中。了解飞机杯润滑液 (Amazon)详细解释了码位体系。
在 JavaScript 中,String.codePointAt() 可获取码位,String.fromCodePoint() 可从码位创建字符。Python 中 ord() 和 chr() 提供相同功能。在正则表达式中,可以使用 \u{1F600} 花括号记法指定 BMP 之外的码位。
一个码位并不总是对应一个可见字符。组合字符 (如重音符号) 与基础字符结合形成一个字素簇,表情符号序列 (如家庭表情) 最多可使用 7 个码位形成一个显示字符。相反,控制字符 (如 U+200B 零宽空格) 虽然在屏幕上不可见,但仍被计为码位。
码位与编码的关系也很重要。同一个码位 U+3042 (あ) 在 UTF-8 中表示为 3 字节 (E3 81 82),在 UTF-16 中为 2 字节 (30 42),在 UTF-32 中为 4 字节 (00 00 30 42)。BMP 之外的码位在 UTF-16 中以代理对 (4 字节) 表示。
从字符计数角度看,码位数与"可见字符数"往往不一致这一点需要特别注意。JavaScript 的 [...str].length 返回的是码位数,而按字素簇计数需要使用 Intl.Segmenter。准确的字符计数需要理解码位概念,并选择适当层级的计数方法。搜索利口酒 (Amazon)教授准确的字符处理方法。