不是用来写字的码点:边界、保留、私用与回退记号
一面 🇹🇼 在中国大陆的设备上只显示成两个字母方块 🇹🇼,一个 U+10FFFF 是整个 Unicode 的最后一个码点——
它们提醒我们:code point ≠ 普通可见字符。码空间 U+0000 ~ U+10FFFF 里,有的码点是边界、
有的永久保留给机制(代理区)、有的标准永不定义(私用区 / 非字符)、有的是控制 / 回退记号
(替换符 �、bidi 反转、单用的 Regional Indicator)。这页拿一个探针把它们逐一点出来,再看它们在 JS 里真实的行为。
码点探针:拖一个码点,看它是什么「身份」
输入 / 拖一个 code point(0 ~ 0x10FFFF),实时报它落在哪个区、是不是合法
scalar value、属不属于代理 / 非字符 / 私用,以及本浏览器 \p{…} 怎么判它:
U+
U+D800 ~ U+DFFF 这 2048 个号是 code point,
但不是 Unicode scalar value——它们专门留给 UTF-16 代理对拼补充平面字符,
单独出现不能合法编码。能正常出现在文本里的,是「scalar value」= 全体码点减去代理区。
码空间地图:17 个平面与特殊区段
Unicode 码空间分成 17 个平面,每个平面 65536 个码点,共 1,114,112 个——尽头正是 U+10FFFF。
大多数平面是文字,特殊用意的区段集中在几个平面里(绿色):
把这些「特殊区段」摊开成一张表,连同 JS \p{…} 能不能认它:
…FFFE / …FFFF)和 U+FDD0~U+FDEF 一起,共 66 个非字符,
永久保留给程序内部当哨兵 / 标记,永不分配给真正的字符。
现场:这些码点在 JS 里到底怎么表现
上面是「身份」,这里是「行为」——四个最常撞见的特殊码点,数值全是当场算出来的,不是写死的:
番外:花钱「赞助」一个字符,是怎么回事?
一个常见误解:「私用区是不是 Unicode 卖给 / 留给赞助商的?」——不是。私用区是谁都能用的公共空白, 标准只承诺永不在那里放官方字符,含义靠私下约定(见上表 PUA 行),没有谁能买断。 真正和「赞助」有关的是另一件事:Unicode Consortium 的 Adopt a Character 募捐项目。
$5,000(某字符唯一赞助人)/ 🥈 Silver $1,000(最多 5 人)/ 🥉 Bronze $100。
所以它和上面的私用区 PUA 是两码事:PUA 是「公共空白、私下约定」,Adopt 是「给标准组织捐款、领证书」。
官方:认领页 · aac.unicode.org/adopt · 已认领 / 赞助人名单 · aac.unicode.org/sponsors
延伸:Unicode FAQ · Private-Use Characters, Noncharacters & Sentinels 把私用区 / 非字符的用途讲清;Trojan Source(CVE-2021-42574) 专讲 bidi 控制符怎么让源码「看的和编译的不一样」;逐码点查证可用 Full Emoji List 看各平台对 🇹🇼 等的真实渲染。