# 蜂巢 job_id 字符白名单 · 区块表(唯一真源;本文件由脚本生成,勿手改) # # 唯一真源:本文件是 id 字符集判据的**唯一数据源**——三处读者读同一份数据,任何一处都不得 # 再手写/内嵌区间常量(2026-09-30 使用者裁定 ①-(c):判据从「Unicode 属性判定」换成「区块 # 白名单」;旧机制依赖两侧运行时的 Unicode 属性表版本,全码点意义上不可能同判)。 # 契约与登记:docs/plans/全中文编码与蜂巢任务标识契约_v2.0.md §四.4 / §四.8。 # # 三处读者(全部 fail-closed:表缺失 / 解析出空区间集 ⇒ 判据一律返回 false,绝不放行): # ① Rust hive/src/job.rs —— include_str! 编译期嵌入 + 首次使用惰性解析(纯 std) # ② Python hive/hive_mcp/mcp_server.py —— 模块导入时读一次(不做每调用 I/O) # ③ md_cg md_cg/units.py —— 同样读这份文件(读数据不是 import,不违背零依赖家法) # # 生成命令(本表**由脚本生成、可重跑**;手改必被 --check 判陈化): # python -X utf8 scripts/gen_id_charset_blocks.py --write # 落盘 # python -X utf8 scripts/gen_id_charset_blocks.py --check # 守卫:重算 != 盘上 ⇒ 退出 1 # python -X utf8 scripts/gen_id_charset_blocks.py # 干跑:逐区块贡献 + 未收明细 + 自检 # # 生成判据(只用标准库;这是判据本身,不是一次性动作): # 在候选区块内逐码点取交集 —— (a) unicodedata.category(c) ∈ {Lu, Ll, Lt, Lm, Lo, Nd} # 且 (b) NFC 稳定(unicodedata.normalize('NFC', c) == c);保留者**归并成最小区间**。 # 即 **区块选择**决定表达面,**类目 + 稳定性**过滤掉区块内的标点/符号/会改写的形态。 # 表内每个码点都 NFC 稳定(生成器与守卫各自全表重算一遍)⇒ 判据不必做真 NFC 计算, # 也保证 id 已是 NFC 形态(拒收而非静默归一化)。 # `_`(U+005F, Pc) 与 `.`(U+002E, Po) **不在本表内**:它们由三处读者的**结构分支**处理 # (`_` = 槽分隔符;`.` = 非尾点、非单独才收)——故「字符判据 ≡ 本表」的断言范围是 # **字符类判据**,不含这两个结构字符(c13)。三处读者另有逐条显式拒收(c7/c9):零宽 # U+200B..U+200F/U+2060/U+FEFF、双向控制 U+202A..U+202E/U+2066..U+2069、路径成分 # `/` `\` `:`、单独 `.`/`..`、尾点、首尾空白、控制字符、Windows 保留设备名(含 # CON.txt 形态、按 `_` 分段任一段)——**它们不在表内是默认被拒,但读者必须逐条显式断言**。 # # 格式(每行一个左闭右闭十六进制区间,四位起对齐;`#` 开头与空行忽略): # 0030-0039 # 4E00-9FFF # 解析配方(三处读者同此一条,不许各写一套):line.split('#')[0].strip();空则跳过; # 否则 split('-') 两段 int(x, 16) = (lo, hi)。**正文不含行内注释**(防三种解析各写一套), # 表头注释一律以 `#` 起行。 # # 候选区块清单(编排侧 c4 裁定;计数 = 本表从该段采纳的码点数,脚本重跑时重算): # [ASCII 字母数字与下划线] # ASCII 字母数字与下划线(0020-007E 内按类目过滤) 0020-007E 采纳 62 # └ 未收 category 33(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # [拉丁字母] # Latin-1 字母 00C0-00FF 采纳 62 # └ 未收 category 2(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # Latin Extended-A 0100-017F 采纳 128 # Latin Extended-B 0180-024F 采纳 208 # [希腊与科普特] # 希腊与科普特 0370-03FF 采纳 128 # └ 未收 category 6(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # └ 未收 cn 9(本地 unicodedata 判未分配) # └ 未收 nfc 1(单字符 NFC 不稳定) # [西里尔] # 西里尔 0400-04FF 采纳 248 # └ 未收 category 8(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # 西里尔补充 0500-052F 采纳 48 # [日文假名] # 平假名 3040-309F 采纳 89 # └ 未收 category 4(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # └ 未收 cn 3(本地 unicodedata 判未分配) # 片假名 30A0-30FF 采纳 94 # └ 未收 category 2(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # 片假名语音扩展 31F0-31FF 采纳 16 # [谚文] # 谚文音节(预组合) AC00-D7A3 采纳 11172 # [CJK 符号 / 统一表意 / 扩展A] # CJK 符号与标点 3000-303F 采纳 9 # └ 未收 category 55(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # CJK 统一表意 4E00-9FFF 采纳 20992 # CJK 扩展A 3400-4DBF 采纳 6592 # [CJK 扩展B..I(c4 原文的一组八区间)] # CJK 扩展B 20000-2A6DF 采纳 42720 # CJK 扩展C 2A700-2B73F 采纳 4154 # └ 未收 cn 6(本地 unicodedata 判未分配) # CJK 扩展D 2B740-2B81F 采纳 222 # └ 未收 cn 2(本地 unicodedata 判未分配) # CJK 扩展E 2B820-2CEAF 采纳 5762 # └ 未收 cn 14(本地 unicodedata 判未分配) # CJK 扩展F 2CEB0-2EBEF 采纳 7473 # └ 未收 cn 15(本地 unicodedata 判未分配) # CJK 扩展I 2EBF0-2EE5D 采纳 0 # └ 未收 cn 622(本地 unicodedata 判未分配) # CJK 扩展G 30000-3134F 采纳 4939 # └ 未收 cn 5(本地 unicodedata 判未分配) # CJK 扩展H 31350-323AF 采纳 4192 # [注音] # 注音 3100-312F 采纳 43 # └ 未收 cn 5(本地 unicodedata 判未分配) # 注音扩展 31A0-31BF 采纳 32 # # 有意不收(契约条款,不是遗漏): # · 谚文 Jamo(conjoining)(1100-11FF):单个 Jamo 自身 NFC 稳定,但**字符串层面**相邻 Jamo 会被 NFC 组合成音节(实测 U+1100 U+1161 → U+AC00)⇒ 逐字符判据保证不了整串已归一化;只收预组合音节 AC00-D7A3 # · 谚文兼容 Jamo(3130-318F):与预组合音节同形(NFKC 会改写、可拼回同一音节)。**实测补注(不改裁决)**:兼容 Jamo 无规范分解,NFC 对它们惰性(实测 NFC(U+3131) == U+3131、NFC(U+3131 U+314F) 不变)——故 c4 给的『字符串层 NFC』理由严格只覆盖 conjoining Jamo(1100-11FF);本段的实际理由是 NFKC 改写面 + 与预组合音节同形 # · 谚文 Jamo 扩展-A/B(A960-A97F、D7B0-D7FF):conjoining Jamo 的延伸段(字符串层与相邻 Jamo 组合)——与 1100-11FF 同类;**c4 的『有意不收』原文未点名这两段**(登记缺口,本表按同理由不收) # · CJK 兼容表意(F900-FAFF):有**规范**分解(NFC 会改写)⇒ 也过不了 c3 的 (b) 条件 # · CJK 兼容表意补充(2F800-2FA1F):同上(有规范分解) # · 其余兼容/带圈/上下标/数学字母数字/全角半角(00AA-00AA、00B2-00BA、2070-209F、2100-218F、2460-24FF、3130-318F、3200-33FF、FB00-FB4F、FE30-FE4F、FE50-FE6F、FF00-FFEF、1D400-1D7FF):契约点名一揽子不收(区块选择裁决):它们本就不在候选清单内,故拒收立场不依赖类目/NFC 过滤 # # 统计(脚本每次重跑重算写回,勿手改): # unicodedata 版本:15.0.0(本表是该版本的**快照**:解释器升级后须重跑并复核 --check) # 候选:24 段 / 110177 码点;采纳 109385 码点;归并成 37 条最小区间;候选段两两不相交:是 # 未收 cn 681 码点(本地 unicodedata 判未分配) # 未收 category 110 码点(类目 ∉ {Lu,Ll,Lt,Lm,Lo,Nd}) # 未收 nfc 1 码点(单字符 NFC 不稳定) # 版本陈化点名:CJK 扩展I(2EBF0-2EE5D)在本版本:判未分配(Cn) 622 码点 ⇒ 采纳 0 码点 # (该段是 Unicode 15.1 新增;Python 升到 ≥15.1 后重跑本脚本即自动纳入,不静默) # NFKC 面补注(本判据只有 NFC 面):表内 34 个码点 NFKC 会改写但 NFC 稳定 ⇒ 按 c3 采纳。 # 旧机制(NFC_REWRITE_BLOCKS,本批退休)曾以『兼容分解』为由排除其中的 0132-0133 / 01C4-01CC / 01F1-01F3(14 码点)—— # 它们在本表下由拒转收;其余 20 个旧机制本就采纳。NFKC 改写面**不在本判据面内**。 # 合并区间:0132-0133、013F-0140、0149-0149、017F-017F、01C4-01CC、01F1-01F3、037A-037A、03D0-03D6、03F0-03F2、03F4-03F5、03F9-03F9、309F-309F、30FF-30FF # 0030-0039 0041-005A 0061-007A 00C0-00D6 00D8-00F6 00F8-024F 0370-0373 0376-0377 037A-037D 037F-037F 0386-0386 0388-038A 038C-038C 038E-03A1 03A3-03F5 03F7-0481 048A-052F 3005-3006 3031-3035 303B-303C 3041-3096 309D-309F 30A1-30FA 30FC-30FF 3105-312F 31A0-31BF 31F0-31FF 3400-4DBF 4E00-9FFF AC00-D7A3 20000-2A6DF 2A700-2B739 2B740-2B81D 2B820-2CEA1 2CEB0-2EBE0 30000-3134A 31350-323AF