算法与数据结构 / regex · Unicode 字符模型与一个自研引擎 / code point 检视器:逐字符拆码点 待审核 23 / 36
实战 · 逐字符拆码点

code point 检视器:逐字符拆码点

前面几页各自拆过一层:码点与 UTF-16 / UTF-8 讲存储,\p{…} 属性类 讲档案,字素簇 讲「一个字符」的边界。本页把它们合到一个工具里:输入或粘贴任意文本,逐个 code point 摊开——每个码点的编号、General_Category 大类、所属 block,以及 UTF-8 与 UTF-16 两套存储层的字节。多码点拼成的字素簇用虚线框聚拢,四层计数并列在顶部。

1 · 检视器

图 1-1 · 任意文本的逐码点拆解,多码点字素簇用虚线框聚拢,顶部并列字形、code point、UTF-16 码元与 UTF-8 字节四个计数。可粘贴文本或点示例。

2 · 怎么读这张拆解

每张卡片是一个 code point。左上是字形,看不见的字符用 占位并在下方标出角色;右上是 U+XXXX 编号;角标是 General_Category 的大类(L 字母、N 数字、P 标点、S 符号、M 组合记号、Z 分隔、C 控制等)。卡片里的 UTF-8 行是它在磁盘与网络上的字节,变长 1 到 4 个;UTF-16 行是它在 JS 字符串里的码元,补充平面字符(大于 U+FFFF)占两个码元,也就是一对代理。

警示 · 字形数、code point 数与码元数三者互不相等,这是本系列反复强调的一点。🤦🏼‍♂️ 一个字形是 5 个 code point、7 个 UTF-16 码元、17 个 UTF-8 字节;é 写成 e 加组合附标时是两个 code point 却仍是一个字形。按 str.length 截断会切碎序列、产出半个乱码;要按用户感知计数,得数字素簇。工具把四个口径并列,就是为了让这层差异一眼可见。

注 · 这页做的是「读」——把任意文本拆开看清里面有什么;按名反查 做的是「查」,受控输入框 做的是「写」,三页合成一套。想深挖某一层,码点与代理对的换算见 字符的编码,字素簇的边界规则见 字素簇

3 · 参考文献

  1. Unicode. UAX #44: Unicode Character Database. General_Category、Block 与码点档案各字段的定义,本页卡片上的属性照它取。unicode.org
  2. Unicode. UAX #29: Unicode Text Segmentation. 字素簇边界规则,决定哪些码点会被虚线框聚成一格。unicode.org
  3. Codepoints. 逐码点数据库. 每个码点的完整档案:名称、gc、block、各编码字节与相关字符。codepoints.net