Unicode 显微镜 · 四个可计数层级
一个“字符”,可能有四种计数答案。
人眼看到的字符、JavaScript 计算的长度、Unicode 分配的码点和 UTF-8 实际存储的字节数可能完全不同。先保留每一层证据,再决定是否规范化、转义或排序。
LENS 011
Grapheme
用户感知的字符簇
LENS 027
Code point
Unicode 标量值
LENS 0311
UTF-16 code unit
JavaScript length 的计数
LENS 0425
UTF-8 字节
编码后的存储长度
字符簇结构显微镜
👨🏽💻
U+1F468MANUTF-16 surrogate pairU+1F3FDSKIN TONE肤色修饰符U+200DZWJ连接信号U+1F4BBLAPTOPUTF-16 surrogate pair码点明细
AU+0041004141\u0041
éU+00E900E9C3 A9\u00e9
𝄞U+1D11ED834 DD1EF0 9D 84 9E\u{1D11E}
ZWJU+200D200DE2 80 8D\u200d
规范化棱镜
看起来一样,底层字节可以不同。
NFC
é
U+00E9
2 字节
NFD
e + ◌́
U+0065 U+0301
3 字节
NFKC
兼容等价折叠
可能抹去全半角或连字差异
NFKD
分解并兼容折叠
变化幅度最大
不可见字符雷达
BOM
U+FEFF文件或文本边界
ZWJ / ZWNJ
U+200D / U+200C字形连接与 Emoji
Bidi 控制符
U+202A…U+2069视觉顺序
NBSP 家族
U+00A0 / U+202F禁止换行的排版空格
Variation Selector
U+FE0F选择文本或 Emoji 呈现
不同语境的转义写法
JavaScript
\u{1F680}Unicode 标量语法
JSON
\uD83D\uDE80UTF-16 surrogate pair
HTML
🚀数字字符引用
Swift
\u{1F680}Unicode 标量语法
排序边界
按码点排序,不等于符合人类语言习惯的排序。
locale、敏感度、数字排序规则、规范化形式和运行时 Unicode 数据版本都会影响顺序。排序结果应写明策略;数据库键则需要明确且带版本的契约。