regex 总览待审核
码空间 · 特殊用意的码点

不是用来写字的码点:边界、保留、私用与回退记号

一面 🇹🇼 在中国大陆的设备上只显示成两个字母方块 🇹🇼,一个 U+10FFFF 是整个 Unicode 的最后一个码点—— 它们提醒我们:code point ≠ 普通可见字符。码空间 U+0000 ~ U+10FFFF 里,有的码点是边界、 有的永久保留给机制(代理区)、有的标准永不定义(私用区 / 非字符)、有的是控制 / 回退记号 (替换符 �、bidi 反转、单用的 Regional Indicator)。这页拿一个探针把它们逐一点出来,再看它们在 JS 里真实的行为

码点探针:拖一个码点,看它是什么「身份」

输入 / 拖一个 code point(0 ~ 0x10FFFF),实时报它落在哪个区、是不是合法 scalar value、属不属于代理 / 非字符 / 私用,以及本浏览器 \p{…} 怎么判它:

U+
scalar value vs code point:代理区 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{…} 能不能认它:

U+10FFFF 的双重身份:它既是码空间的最后一个码点,本身又是一个非字符 (noncharacter)—— 每个平面最后两个码点(…FFFE / …FFFF)和 U+FDD0~U+FDEF 一起,共 66 个非字符, 永久保留给程序内部当哨兵 / 标记,永不分配给真正的字符。

现场:这些码点在 JS 里到底怎么表现

上面是「身份」,这里是「行为」——四个最常撞见的特殊码点,数值全是当场算出来的,不是写死的:

番外:花钱「赞助」一个字符,是怎么回事?

一个常见误解:「私用区是不是 Unicode 卖给 / 留给赞助商的?」——不是。私用区是谁都能用的公共空白, 标准只承诺永不在那里放官方字符,含义靠私下约定(见上表 PUA 行),没有谁能买断。 真正和「赞助」有关的是另一件事:Unicode Consortium 的 Adopt a Character 募捐项目。

Adopt a Character(认领一个字符):给 Unicode 捐一笔款,「认领」一个早已编码、人人都在用的公共字符, 换来一张电子徽章 + 证书和官网致谢——不会拿到 code point,也没有任何所有权,那个字符照旧属于标准、归大家共用。 分三档:🥇 Gold $5,000(某字符唯一赞助人)/ 🥈 Silver $1,000(最多 5 人)/ 🥉 Bronze $100。 所以它和上面的私用区 PUA 是两码事:PUA 是「公共空白、私下约定」,Adopt 是「给标准组织捐款、领证书」。
官方:认领页 · aac.unicode.org/adopt · 已认领 / 赞助人名单 · aac.unicode.org/sponsors
和别的页串起来:代理区为什么是「孤儿」——看 字符的编码 的代理对换算; 单用的 Regional Indicator 怎么两两拼成国旗——看 RGI 序列; 零宽 / BOM 这类「看不见但有空白语义」的字符——看 空白与换行
延伸:Unicode FAQ · Private-Use Characters, Noncharacters & Sentinels 把私用区 / 非字符的用途讲清;Trojan Source(CVE-2021-42574) 专讲 bidi 控制符怎么让源码「看的和编译的不一样」;逐码点查证可用 Full Emoji List 看各平台对 🇹🇼 等的真实渲染。