RGI:国旗 / 子地区旗 / 肤色,与 \p{RGI_Emoji}
RGI = Recommended for General Interchange。并非所有理论上合法的 emoji 序列都能在各平台正常显示,
Unicode 因此圈定一个子集 RGI:其一 标准认可;其二 Apple / Google / Microsoft / Samsung 等通常都支持;
其三 可在不同系统间可靠传输。Basic_Emoji 是 RGI_Emoji 的子集(历史上先有 Basic,后扩成 RGI)。
日常业务直接用 \p{RGI_Emoji} 即可。这页拆开它下面几类序列。
国旗 = 两个 Regional Indicator
\p{RGI_Emoji_Flag_Sequence}:区域码 U+1F1E6 ~ U+1F1FF 共 26 个(对应 a~z),
两个拼成一面国旗(ISO 3166 双字母)。挑两个字母拼:
U+1F1E8(C)+ U+1F1F3(N)。逻辑层写 \u{1F1E8}\u{1F1F3},
存储层(UTF-16)写 🇨🇳 —— 每个区域码都是补充平面字符,各占一个代理对(见「code point / UTF-16」那页)。
\p{RGI_Emoji_Flag_Sequence} 只管「这两个区域码是不是合法 RGI 国旗」,
至于显不显示成旗子则是字体 / 系统层的事——出于政治因素,中国大陆区域的系统(iOS / 部分 Android)不渲染
TW(U+1F1F9 T + U+1F1FC W)国旗,只回退成两个 Regional Indicator 字母方块 🇹🇼。
正则仍判它合法,但你眼睛看到的可能不是旗子。各平台到底长什么样,可到
Full Emoji List 逐厂商对照。
子地区旗 = 黑旗 + Tag 标签
\p{RGI_Emoji_Tag_Sequence}:用 U+E0020 ... U+E007E(96 个,和 ASCII 可打印字符一一对应)
给黑旗 🏴 贴「标签」,不新增大量码点就扩展出子地区旗。末尾用 U+E007F(cancel tag)收尾。
拆解:黑旗基底 + tag 字符(对应 ASCII)+ cancel
肤色 = 基础 emoji + 修饰符
\p{RGI_Emoji_Modifier_Sequence} = 支持修饰符的 Basic_Emoji + 肤色修饰符。
目前 5 种肤色:U+1F3FB(light)… U+1F3FF(dark)。
约束:只能用于人 / 身体部位 / 人类动作 类 emoji。
整体匹配:/\p{RGI_Emoji}/v
\p{RGI_Emoji} 匹配一个完整的 RGI emoji——上面所有序列(单码点 / VS16 / ZWJ / 国旗 / Tag / 肤色)
它都认。这就是日常业务该用的那一个。输入一段混合文本,看它把每个完整 emoji 整段框出来: