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~


推薦閱讀:
相關文章