2018年11月6日收到了关于Unicode, 12.0.0 Beta版的检查通知(PRI #389),检查时间截止到2019年1月7日。我的朋友H. W.提交了一份关于T源参考来源信息的检查意见,大概的意思就是现在Unicode码表上的的参考来源信息和CNS 11643官网上的对不上。类似的问题我之前和H. W.也讨论过,他发现了一些,我也发现了一些,后来在Unihan上讨论时,Ming Fan也有新的发现。

现在在Unicode上的T源字由服务于IRG且名义为TCA(台北市电脑商业同业工会)的组织提交并管理与CNS 11643对应的mapping等工作,而TCA实际上是由CMEX(财团法人中文数位化技术推广基金会,简称中推会)负责了大部分的工作。(我刚开始参与IRG工作时,还以为是「中国统一推进委员会」什么的,毕竟大家都只说简称。)简单来说,原则上每一个在Unicode上的标记为与台湾地区有关的汉字都应当有对应的CNS 11643码位,然而越往后期,会发现很多字提交之后,即使已经收录了,但mapping依然没改过来。

根据《国字整理小组十年》等书籍资料,CNS 11643在1986年正式版本之前,有过了多次尝试,分别为1981年的《中文资讯标准码》、1972年的《中文资讯标准交换码》、1973年的《通用汉字标准交换码》等。现在我们谈的CNS 11643其实是从1986年版本开始的,正式出版的版本分别有1986版(《通用汉字标准交换码》)、1992年(《中文标准交换码》)、2007年(《中文标准交换码》)。TCA预计未来近几年会再发布正式版本。自从他们做好了CNS 11643全字型档的网站后,网路版本也是可以被认可的了。

一、CNS 11643的编码框架

这份标准和当时多数的汉字编码方案相似都采用了ISO/IEC 2022的94×94的框架。

GB、JIS、KS的做法是采用基本集加多个扩展集的办法来收录新字(详细字元安排此处不谈,但可以说CNS和这几个不是一个路子的)。

同为台湾地区的标准的CCCII(注意CCCII和EACC的关系),采用了可见字元部分三位元组等长码的办法来安放字元,共设立94个字面,也就是最小为0x212121,最大为0x7E7E7E。再将6个字面(Plane)合为一个层(Layer),而一到九层中,只要后二位元组相同,它们则必有相关的字际关系。第十三和十四层放置其他字元。因为第一层中的0x212121到0x212F7E是用来放置标点符号等的,所以其他层对应的位置就为空。(这个方案过于理想化,如果真的熟悉汉字编码和其他文字编码的话,会发现这个方案也没它自己说的那么好。)

CNS 11643在CCCII发布之后才诞生,也承接了一些概念和做法,比如不是用扩展集的概念,而是把设置了多个字面(现在为80),但去掉了层的概念,不同字面的字际关系是不明朗的。

到了Big 5的年代,那又是另外一种思路了。

二、CNS 11643的编码实现

对大家最熟悉的莫过于是一款名为全字型档的字体,包括了宋体三个文件和楷体三个文件。原则上已经编码在Unicode的部分,可以通过在Unicode的环境下调用相应的字形,剩余的则map到第15平面(SPUA-A)。

CNS 11643的标准中有提及一种多7位的实现办法(需要用到SI、SO),但实际使用并不是太广泛,他们自己强调政府部门间的文件传输必须用这个办法。

CNS 11643从第1到第7字面都有申请了ISO-IR的位置,从小到大分别为171(0x47)、172(0x48)、183(0x49)、184(0x4A)、185(0x4B)、186(0x4C)、187(0x4D)。在ISO-2022-CN中从这个来改造。

另一种常见的办法是EUC-TW。早期的EUC-TW,是使用双位元组表示第一字面(和其他所有EUC实现一样的做法),但其他字面使用0x8E+字面号+码位的四位元组办法构成。现在双位元组的做法已经取消了,任何一个可见字元都是四位元组表示。(我下面还会谈到ASCII部分的问题。)

三、Pseudo-CNS-E

这个是谈到CNS 11643的时候最不该被绕过去的历史遗留问题。在1986年发布第一个正式版时,仅仅启用了头两个字面,只是把教育部门公布的常用字和次常用字编入,字量和两年前公布的Big5方案一样(Big5有两个字编了两次)。然而到了1988年,相关部门又增加了第14字面以解决现实需要,这部分作为CNS的用户用字加入到了URO。这部分的码位是从0x2121到0x6435。到了1992年版的时候,0x2121到0x6246被移到了第三字面,0x6247到0x6435被移到了第四字面。以上这些都是文件上明确说明了的,因而知道的人不少。

而在开始研制URO的时候,UTC又要求在URO中加入一些完全还不在已有国家和地区标准中的字(其中包括一部分的方言字,尤其是粤语字,另外一个来自中国的机构要求加入延边朝鲜族自治区使用的吏读字)。因而需要给这些字找个身份。吏读字全部放在假GB1,方言字等其他用途的汉字拆分放在假GB1和假CNS-E。所以当时从0x6448到0x672A的部分就可以被称为Pseudo-CNS-E。在1992版,压根没有这部分字的身影,虽然Unicode后来把它们全都记入第三字面,直到2007版才加了进去。然而又有了新的问题是,原来的字有部分被挖空了,经过比对才发现是在其他字面上另收了的字会被挖空,但又有一些也没有对应的重复字,具体列表如下。(如果有错,欢迎提出意见。)

TRefU1 TRefU11 UCS UChar. CNS PUA/UCS 使用地方

E-6449 T3-6449 U+4F68 佨 15-2327 U+FFFED 彰化县;高雄市

E-644A T3-644A U+4FE7 俧 15-2930 U+FFFE7 台中市;澎湖县;台北市;台北县;台东县;屏东县;高雄市;高雄县;嘉义县

E-644B T3-644B U+503F 倿 15-2D65 U+FFFE0 台北市;台北县;台东县;南投县

E-6450 T3-6450 U+5324 匤 5-234B U+FFFF3 台北市;高雄市;高雄县;澎湖县

E-6451 T3-6451 U+5365 卥 6-2A21 U+FFFF1

E-6454 T3-6454 U+54CB 哋 15-295D U+FFFE5

E-6458 T3-6458 U+55F4 嗴 15-4055 U+FFFBC 云林县;台北市;台北县;台东县;台南市;台南县;屏东县;高雄县;嘉义县;澎湖县

E-645F T3-645F U+5759 坙 4-2361 U+FFFFD

E-6462 T3-6462 U+5812 堒 15-335C U+FFFD4 台中市;台中县;南投县;云林县;嘉义市;彰化县;台北市;台北县;台东县;台南县;宜兰县;屏东县;高雄市;高雄县;嘉义县

E-6463 T3-6463 U+5813 堓 15-335D U+FFFD3 台中县;台南市;南投县;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;桃园县;高雄市;高雄县;云林县;新竹县;嘉义县

E-6468 T3-6468 U+5AD1 嫑 15-407B U+FFFBB 云林县;彰化县;台北市;台北县;台南县;高雄市;嘉义县

E-6469 T3-6469 U+5AD3 嫓 15-4124 U+FFFBA

E-646A T3-646A U+5B67 孧 15-2650 U+FFFEA 基隆市;澎湖县;台东县;屏东县;桃园县;高雄市;高雄县

E-646B T3-646B U+5C57 屗 15-2F25 U+FFFDF

E-646D T3-646D U+5CD5 峕 4-287D U+FFFFA

E-6470 T3-6470 U+5DA5 嶥 15-4E5A U+FFFAC 台北市

E-6474 T3-6474 U+5ECD 廍 15-4766 U+FFFB4 台南市;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县;台中市;台北市;台北县;台东县;台南县;宜兰县;金门县;屏东县;桃园县;高雄市;高雄县;新竹县;嘉义县

E-6479 T3-6479 U+6125 愥 15-3B26 U+FFFCD 台中县;台北市

E-647A T3-647A U+6150 慐 15-477B U+FFFB3 台中县;台南市;南投县;云林县;彰化县;澎湖县;台北市;台东县;台南县;金门县;屏东县;高雄市;高雄县;嘉义县

E-647C T3-647C U+6360 捠 15-2F5F U+FFFDD 台北县;台南市;高雄县;彰化县

E-6521 T3-6521 U+6403 搃 15-3B33 U+FFFCC 澎湖县;台北县;台东县;台南县;屏东县;桃园县;高雄县;彰化县

E-6524 T3-6524 U+7A25 稥 15-417C U+FFFB9 云林县;彰化县

E-6527 T3-6527 U+6702 朂 15-3B5E U+FFFCB 台南市;基隆市;云林县;彰化县;台北市;台北县;台南县;桃园县;高雄市

E-6529 T3-6529 U+67AC 枬 15-2752 U+FFFE9 台中市;台中县;台南市;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;苗栗县;桃园县;高雄市;高雄县;新竹县;嘉义县

E-652A T3-652A U+6810 栐 15-2B3E U+FFFE4 台中市;台中县;南投县;云林县;彰化县;台北市;台北县;桃园县;高雄县;新竹县;嘉义县

E-652B T3-652B U+6806 栆 15-293B U+FFFE6 台中市;台中县;台南市;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;桃园县;高雄市;高雄县;云林县;新竹县;嘉义县

E-652E T3-652E U+692C 椬 15-3B6A U+692C 台中市;台中县;台南市;南投县;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;宜兰县;屏东县;高雄市;高雄县;嘉义县

E-652F T3-652F U+6929 椩 15-3B66 U+FFFCA 台南市;云林县;澎湖县;台北市;台东县;台南县;南投县;屏东县;高雄市;高雄县;嘉义县

E-6530 T3-6530 U+6A2D 樭 15-4F45 U+FFFAB 台中市;云林县;彰化县;台东县;台南县;屏东县;桃园县

E-6532 T3-6532 U+6A7A 橺 15-552A U+FFFA2 台中县;台北市;台东县;屏东县

E-6534 T3-6534 U+6AE6 櫦 15-6250 U+FFF91

E-6535 T3-6535 U+6AF5 櫵 15-6538 U+FFF88 台中市;台中县;台南市;南投县;云林县;彰化县;澎湖县;台北市;台北县;台东县;台南县;屏东县;高雄市;高雄县;新竹县;嘉义县

E-6536 T3-6536 U+6B0D 𣐤 15-694D U+FFF81 台中市;台中县;云林县;嘉义市;台北县;嘉义县

E-6538 T3-6538 U+6BDC 毜 15-2458 U+FFFEC 台北市;高雄市

E-6539 T3-6539 U+6BDD 毝 15-245B U+FFFEB 台中县;基隆市;新竹县;澎湖县;台北市;台北县;台东县;屏东县;高雄市;高雄县

E-653A T3-653A U+6BF5 毵 云林县;彰化县;澎湖县

E-653D T3-653D U+6DA5 涥 15-303C U+FFFDC 台北市;云林县;嘉义县

E-653E T3-653E U+6E0F 渏 15-362B U+FFFD2 台中市;台中县;台南市;云林县;彰化县;澎湖县;台北市;台东县;台南县;屏东县;桃园县;高雄市;高雄县;嘉义县

E-6541 T3-6541 U+6E8B 溋 15-3C4C U+FFFC7 台中县;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;高雄县;嘉义县;彰化县

E-6542 T3-6542 U+6E7C 湼 4-385C U+FFFF7 台北市;宜兰县;新竹县

E-6545 T3-6545 U+6F49 潉 15-4935 U+FFFB2 台南市;云林县;彰化县;澎湖县;台北县;台东县;台南县;屏东县;高雄县;嘉义县

E-6546 T3-6546 U+6F9D 澝 15-4F60 U+FFFAA 台北市

E-6548 T3-6548 U+6FF8 濸 15-5A68 U+FFF98 台中县;台南市;南投县;嘉义市;台北市;台北县;台东县;台南县;宜兰县;屏东县;苗栗县;高雄市;高雄县;嘉义县

E-6549 T3-6549 U+702E 瀮 15-626B U+FFF90 台南市;南投县;新竹县;澎湖县;台北市;台北县;台东县;屏东县;高雄县;嘉义县

E-654C T3-654C U+79CC 秌 4-2A6E U+FFFF9 台中市;台中县;台南市;南投县;云林县;彰化县;台北市;台北县;台东县;台南县;屏东县;桃园县

E-654E T3-654E U+70EA 烪 15-305C U+FFFDB 云林县;彰化县

E-6550 T3-6550 U+7111 焑 15-364F U+FFFD1

E-6552 T3-6552 U+713F 焿 15-3C65 U+713F 台中市;台中县;台南市;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;桃园县;高雄市;高雄县;新竹县;嘉义县

E-6553 T3-6553 U+7139 焹 15-3C73 U+FFFC5

E-6554 T3-6554 U+713B 焻 15-3C76 U+FFFC3 新竹县;澎湖县;台中县;台北市;台东县;南投县;屏东县;高雄县

E-6555 T3-6555 U+713D 焽 15-3C74 U+FFFC4 南投县;云林县;彰化县;台北市;台北县;宜兰县;新竹县

E-6556 T3-6556 U+7177 煷 15-4277 U+FFFB8 台北市;苗栗县

E-6557 T3-6557 U+7175 煵 15-4324 U+FFFB7 新竹县;彰化县;台北市;台北县;台南县

E-6559 T3-6559 U+7171 㶽 15-4332 U+FFFB6 台中市;台中县;南投县;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;桃园县;高雄县;嘉义县

E-655A T3-655A U+7196 熖 15-4961 U+FFFB1 台南市;基隆市;云林县;新竹县;彰化县;澎湖县;台中市;台中县;台北市;台北县;台东县;台南县;宜兰县;金门县;南投县;屏东县;桃园县;高雄市;高雄县;新竹县;嘉义市;嘉义县

E-655B T3-655B U+7193 𤆡 4-4458 U+FFFF6

E-655C T3-655C U+71B4 熴 台中市;台中县;台南市;澎湖县

E-655D T3-655D U+71DD 燝 15-556C U+FFFA1 南投县;台北市;台南市;台南县;云林县

E-655F T3-655F U+720E 爎 15-6273 U+FFF8F 台中市;台中县;南投县;云林县;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;屏东县;高雄县;新竹县;嘉义县

E-6560 T3-6560 U+5911 夑 南投县;基隆市;嘉义市;彰化县

E-6562 T3-6562 U+7347 獇 15-4342 U+FFFB5 台中市;台中县;台南市;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;宜兰县;金门县;屏东县;桃园县;高雄市;高雄县;嘉义县

E-6563 T3-6563 U+7348 獈

E-6564 T3-6564 U+73EF 珯 台中市;台中县;南投县;基隆市;云林县;嘉义市;彰化县;澎湖县

E-6565 T3-6565 U+7412 琒 澎湖县

E-6566 T3-6566 U+743B 琻 15-3D3C U+FFFC2 台北市

E-6567 T3-6567 U+74A4 璤 15-557E U+FFFA0 台中市;台中县;南投县;基隆市;云林县;嘉义市;澎湖县;台北市;台北县;台东县;台南县;屏东县;高雄市;高雄县

E-6568 T3-6568 U+748D 璍 15-562A U+FFF9F 台中市;台中县;南投县;基隆市;云林县;嘉义市;彰化县;台北市;台北县;台南县;宜兰县;高雄市;高雄县;新竹县;嘉义县

E-656C T3-656C U+76BC 皼 15-5B3A U+FFF97 台北县

E-656D T3-656D U+7819 砙 B-7C6D U+F9103 台中县;南投县;云林县;彰化县;澎湖县

E-656E T3-656E U+781B 砛 15-2C62 U+FFFE3 台中县;台南市;彰化县;澎湖县;台北县;台南县;宜兰县;金门县;苗栗县;高雄市;高雄县;云林县

E-656F T3-656F U+783D 砽 15-3147 U+FFFD9 台北市;嘉义县

E-6570 T3-6570 U+7853 硓 15-372D U+FFFD0 基隆市;澎湖县;台北市;台东县;屏东县;高雄县;嘉义县

E-6573 T3-6573 U+78B7 碷 15-4A4E U+FFFB0 台中市;台中县;台南市;南投县;云林县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;屏东县;高雄市;高雄县;嘉义县

E-6574 T3-6574 U+78D8 磘 15-5067 U+FFFA8 台中市;台中县;南投县;基隆市;云林县;彰化县;澎湖县;台北市;台北县;台东县;屏东县;桃园县;高雄县;连江县

E-6575 T3-6575 U+78EE 磮 15-5648 U+FFF9E 台中县;台南市;南投县;嘉义市;彰化县;澎湖县;台北市;台北县;台东县;台南县;屏东县;高雄县;云林县;嘉义县

E-6576 T3-6576 U+7922 礢 U+FFF86 台南市;云林县;彰化县

E-6632 T3-6632 U+6711 朑 15-2D2C U+FFFE2 台南市;澎湖县;台北市;台北县;台东县;屏东县;高雄市;高雄县

E-6633 T3-6633 U+6725 𦛨 15-5730 U+FFF9D 台中县;彰化县;澎湖县;台北市;台北县;台东县;宜兰县;屏东县;高雄县

E-6677 T3-6677 U+5E71 幱 4-6339 U+FFFF5

E-6679 T3-6679 U+61D3 懓 15-5450 U+FFFA3 台北市

E-6722 T3-6722 U+5572 啲 15-334B U+FFFD5 宜兰县

值得注意的是,椬(U+692C)的mapping已经修改了,但Unicode还没改;礢(U+7922)现在在SPUA-A中还有字,但码位没找到,2007版也没找到,有时间再看看1992版有没收录在哪里;还有个别字并不是完全同形。

因此在原来Pseudo-CNS-E的部分,除开这些台湾在地政系统都有的字,才是真正的美国提交字(按照前辈会议,其实没有香港什么事)。有些位置还有空缺,我现在也不知道该怎么解释。

四、第八字面

如果大家有认真读过GB 2312-80的话,会发现在附录3种有提到了隐藏的第十区,而在Adobe-GB-1中其实是存在第十区,甚至第十一区的。不过还好第十区是隐藏的,否则到了EUC的时候,又是一件头疼的事情。

而在CNS 11643的第八字面中,0x2121到0x2221确实对应著ASCII中的0x20到0x7E,也就是说虽然EUC规格是兼容ASCII的,但EUC-TW却不打算兼容ASCII,但他们自己的转码工具确实时而支持,时而不支持。多7位的实现不兼容ASCII,估计他们是想在多7位的环境下也能使用ASCII字元,也就是和GB 2312-80第十区一个做法。但是,问题却在于不论是什么方案,0x20都是相当于U+0020的空格,再安排多一个8-2121(0x8EA8A1A1)的意义究竟在哪里,而全形的空格可是1-2121(0x8EA1A1A1)。

五、Unifiable Variants

Unifiable Variants是IRG的一个概念,笼统地指那些可以被认同(unify)的异体字。由于CNS 11643是一个关注落地的实用体系,因而他们收录了大量不需要IRG开会讨论就知道是Unifiable Variants的字元。比如1-4A6A和9-7D58都是对应沉(U+6C89),但1-4A6A右下部是儿(开口),而9-7D58右下部是几(闭口)。现在的Unicode上除了台湾是儿外,都是几(注:朝鲜不用这个字,只用沈)。【此处应当 @Henry Chan 】


我之所以说CNS 11643还在路上,是因为他们确实有很多地方需要梳理和更正,此中还有其他一些有意思的地方,有时间我们再谈。ヾ( ̄▽ ̄)Bye~Bye~


推荐阅读:
相关文章