張小衡
(香港理工大學 中文及雙語學系,香港)
?
中文的同形異碼字問題
張小衡
(香港理工大學 中文及雙語學系,香港)
同一個字符擁有不同的計算機內(nèi)部代碼,這意味著有兩個或兩個以上字形在人的眼中是同一個字,而計算機卻認為是不同的字。這種“人機看法不一致”會給語言信息處理帶來混亂,導致信息檢索不全,統(tǒng)計數(shù)字不準,字詞分類排序不一致等情況。該文結(jié)合Unicode實例專題討論當前計算機上存在的中文同形異碼字問題,包括 (a) 私人造字公有化所形成的同形異碼字,(b) 兼容編碼所形成的同形異碼字,(c) 建立專門的筆畫部首表而形成的同形異碼字,(d) 半寬和全寬字形分別編碼而造成的同形異碼字等,并探討解決問題的方法。
中文字符;同形異碼;Unicode
在繁體字PDF版《中華人民共和國香港特別行政區(qū)政府二零一一至一二年施政報告》 中[1],多處出現(xiàn)“劏房”*劏 tāng, 粵語方言字,指殺。在香港,“劏房”指將大房間分割成(的)小房間,一般用于租借給貧窮人士居住。“劏房”和"豪宅" 的并存是社會貧富懸殊的突出表現(xiàn),是大家關(guān)注的問題。這個詞。如果您也關(guān)心香港的“劏房”問題,想找出施政報告中提到“劏房”的每一處,很可能會利用Adobe Reader 的Find或Advanced Search命令。但是,不管您使用內(nèi)地的微軟拼音中文輸入法(MSPY 2010)還是臺灣的微軟新注音輸入法(New Phonetic 2010)輸入繁體檢索字“劏”,結(jié)果都是一樣: 連一個匹配都沒有找到。但是,原文件中的確有“劏”字。如圖1所示,在計算機報告找不到“劏”字的小窗口下面的原文件中就有“劏”字出現(xiàn)。
顯然,這是一個相當嚴重的中文信息處理問題。
圖1 Adobe Reader報告找不到“劏”字,但該字就在文中。
為了尋找問題的原因,我們從施政報告原PDF
文件上直接將“劏房”拷貝到Adobe Reader 的搜尋文字框里,發(fā)現(xiàn)該詞在文字框里變成“·房”,不能正確顯示。但點擊右邊的"Find next"按鈕卻能順利查找,如圖2所示。
圖2 拷貝原文中的“劏房”,在Adobe Reader 上顯示成“·房”,但能順利查找。
顯然,在計算機的“眼”中,通過微軟中文輸入法輸入的“劏”和施政報告中的“劏”是不同的字符。但是在人的眼中,從語言文字應用的觀點來看,這兩個“劏”完全是同一個字。為了進一步驗證這一看法,我們又將施政報告中的“劏房”復制到MS Word 2010 上。用宋體(Simsun)顯示,得到的也是“·房”。改為大字符集的Simsun-ExtB 或 MingLIU-ExtB,依然未能正確顯示。但是使用支持《香港增補字符集》[2]的MingLiu-HKSCS 或MingLiu-HKSCS-ExtB字體,則能得到正確的“劏房”字樣。詳細情況請見表1。
表1 從香港政府施政報告中復制的“劏房”在MS Word 2010 上的不同字體輸出效果
字體顯示效果Simsun(宋體)·房PMingLiu(新細明體)·房Simsun-ExtB(宋體-ExtB)·房MingLiu-ExtB(細明體-ExtB)·房MingLiu-HKSCS(細明體-HKSCS)劏房MingLiu-HKSCS-ExtB(細明體-HKSCS-ExtB)劏房
可見,香港政府施政報告中的“劏”字使用了《香港增補字符集》的編碼。在MS Word上將光標移至“劏”字后按Alt+X鍵可查得該字的Unicode 編碼是EB7B,用同樣的方法可以看到通過微軟中文輸入法輸入的“劏” 的Unicode 是528F。顯然這兩個字符同形異碼。同形異碼字由于機器代碼不同所以在計算機的眼中是不同的字,但是由于字形相同所以在人的眼中是同一個字。這就解答了上文關(guān)于“劏”字為什么不能正常檢索和顯示的疑問。
當然,同形異碼不會局限于一個“劏”字。其他《香港增補字符集》的字也可能同形異碼。而且增補字符集之外,還有同形異碼現(xiàn)象。下面將結(jié)合從香港政府施政報告、澳門政府施政報告等重要文獻中發(fā)現(xiàn)的實例,分類討論當前計算機上的中文同形異碼字。我們將主要討論Unicode的同形異碼字問題,因為Unicode(等效于國際標準ISO/IEC 10646)正在逐漸成為全世界范圍內(nèi)信息技術(shù)產(chǎn)品開發(fā)的主流,而且將逐步取代現(xiàn)有的國標(GB)碼和大五(Big5)碼等漢字編碼標準[3]。其實,Unicode 已經(jīng)是國際上影響最大的語言文字代碼標準,廣泛應用于MS Windows, MS Office和WWW等人們幾乎天天都要用到的計算機工具。據(jù)谷歌官方博客上的最新報道[4],WWW上有超過60%的文字內(nèi)容是用Unicode編碼的。
香港政府施政報告2011-12繁體字PDF版中的同形異碼字不局限于《香港增補字符集》中的“劏”等方言字。例如,施政報告中“罰款”的“罸”字 (須用MingLiU_HKSCS字體顯示)與Unihan的“罸”同形不同碼,前者的Unicode是EE05,后者的Unicode是7F78。因此,用其中任何一個“罸”都匹配不到另一編碼的“罸”,嚴重影響檢索結(jié)果,進而影響到其他語言信息處理。例如,在Word 2010上將同形異碼字“罸 (EE05) 、罸(7F78) ”轉(zhuǎn)換為簡體字時,得到的是“罸 (EE05) 、罰(7F78) ”。后一個字能正確轉(zhuǎn)換,前一個字卻不行。因為轉(zhuǎn)換字典中只收與一個字碼對應的簡繁體字對。
我們在施政報告上發(fā)現(xiàn)的同形異碼字總結(jié)如表2所示。
表中第一豎列是同形異碼字,共八個,第二列是該字在《香港增補字符集》中分配的Unicode編碼,第三列是該字在Unihan中分配的專用Unicode編碼,最后一列是取自施政報告原文的應用例子。
表2 香港政府施政報告上的同形異碼字
《香港增補字符集》(HKSCS, Hong Kong Supplementary Character Set) 是香港特區(qū)政府資訊科技處研制的收集了(當時)計算機上沒有而市民需要的字符集合。最新版本是2008版,共收5 009個字,在Unicode編碼空間中的私人使用區(qū)(Private Use Area, Range: E000-F8FF)編碼。后來,新版的Unicode (包括Unicode 6.0以后) 的公共中日韓 (CJK)漢字集Unihan收錄了《香港增補字符集》,給每個字符又安排了專用碼點,于是,這些字變成了同形異碼。例如“劏”字在Unicode中既有私人使用區(qū)的代碼EB7B,又有Unihan 的代碼528F。
在私人使用區(qū)造字而引起的同形異碼字有兩種情形。一種是在私人使用區(qū)造的字后來在公共空間又分配了碼位,例如,《香港增補字符集》的情況;另一種是原本Unihan中有某字(目前Unihan收字達七萬多個),但是用戶又在私人使用區(qū)重造這個字。這可能是因為用戶以為電腦上沒有該字,也可能明知有該字,但由于特殊原因而再造一次。例如,學者張小衡和李笑通[5]在給漢字作筆順排檢時,就將筆形字符在Unicode的私人使用區(qū)按照比較合理的代碼順序重新編碼,以便自動排檢。
私人使用區(qū)的同形異碼字在公開使用時,最需要統(tǒng)一到公共代碼空間上來,因為不同的用戶可能用同一個私人使用區(qū)的代碼造出不同的字形來,造成更大的混亂。例如, Unicode EB7B在MingLiU-HKSCS字體中對應的字符是“劏”字,但用MS Outlook字體顯示的字形是“?”,用Wingdings字體顯示字形是“”,用Adobe Arabic字體顯示字形是,簡直是五花八門。
跟香港一樣,澳門特區(qū)政府的重要文獻上也有同形異碼字。表3是我們在《中華人民共和國澳門特別行政區(qū)政府二○一二年財政年度施政報告》[6]繁體字版中發(fā)現(xiàn)的同形異碼字。
表3 《澳門特區(qū)政府二○一二年財政年度施政報告》上的同形異碼字
表中第一豎列是23個同形異碼字。施政報告全文版用的是第二列的代碼,Word 2010不能正確轉(zhuǎn)換成簡體字;而施政報告文本版用的是第三列的代碼,Word 2010能正確轉(zhuǎn)換為簡體字。兩份文件取碼不一,影響計算機信息處理。
在Unicode的編碼空間中,上表第三列的代碼都屬于中日韓Unihan字符,第二列的代碼都屬于中日韓兼容表意文字(或稱中日韓兼容漢字)。兼容表意文字一部分位于CJK Compatibility Ideographs編碼區(qū)域(U+F900 至 U+FA2D),其它的屬于 CJK Compatibility Ideographs Supplement編碼區(qū)域 (U+2F800至U+2FA1D)。詳細說明請見Unicode的相關(guān)碼表,網(wǎng)址http://www.unicode.org/charts/PDF/UF900.pdf和http://www.unicode.org/charts/PDF/U2F800.pdf。
兼容表意文字共有400來個,與原有的漢字同形異碼。其中不少是常用字,例如,“理”字在Unicode中有Unihan 代碼 7406 和兼容碼 F9E4。而且這兩個字形都可以用SimSun和MingLiu字體正常顯示。又如常用字“女”也有兼容碼 F981和Unihan碼5973。還有“年”(5E74,F(xiàn)98E),“度”(5EA6,F(xiàn)A01),行(884C,F(xiàn)A08)等。
根據(jù)Unicode官方文獻說明[7],中日韓漢字兼容區(qū)(U+F900 through U+FA2D) 與主要的CJK統(tǒng)一表意文字塊(primary CJK Unified Ideographs block,即Unihan)分開編碼,是為了方便同韓國標準KS C 5601-1987的往返轉(zhuǎn)換(round-trip conversion with KS C 5601-1987),這些兼容碼不可應用于其他目的。希望今后的澳門政府工作報告能注意到這一點。
同形異碼問題不僅存在于漢字,還存在于非成字的中文字符。非漢字的同形異碼中文字符一般是漢字筆畫和部件(包括偏旁部首)。這些字符原先是零星出現(xiàn)在CJK統(tǒng)一漢字集中,后來又建立專門的部首表和筆畫表[8-10],于是造成同形異碼。例如,筆形“乛”在漢字集(Unihan)中的代碼是U4E5B, 在中日韓筆畫表(CJK Strokes)中的代碼是U2E82(可用Adobe Song Std字體顯示)。由于Unicode筆畫和部件表中有些代碼的字形還未能在SimSun和MingLiU等主流字體上正確顯示,目前使用Unihan字符尤其是其中的BMP(基本多文種平面)字符比較安全。
表4是從文獻[11]整理出來的61個非漢字同形異碼中文字符及其Unicode代碼。
表4 非漢字同形異碼中文字符及其Unicode代碼
上表中的十六進制Unicode數(shù)碼前用U標示,例如,U4E5B表示Unicode 4E5B。某些代碼的字形需用Adobe Song (宋) 字體顯示,例如,U2E82的 “乛”。
Unicode筆畫表和部首表中還包含一些成字字符,而且其中也有同形異碼字,例如,CJK 部首表中有“水”(U2F54),Unihan 中有“水”(U6C34)。又如,漢字“一” (U4E00)、部首“一”(U2F00) 和筆畫“一”(U31D0,在Word 2010 上還不能正常顯示)。
有些占據(jù)書面空間大小不一的同形字符也使用不同編碼,例如,ASCII逗號“,”(U002C)與中文逗號“,”(UFF0C),ASCII“?”(U003F)與中文“?”(UFF1F)在中文書面語中混用時常被人們看作等價字符。當用電腦檢索統(tǒng)計時,卻是有區(qū)別的。有趣的是,微軟新注音中文輸入法的雙/單字節(jié)(Double/Single Byte)逗號分別是“,”(FF0C)和“,”(U002C),而微軟拼音中文輸入法的全形/半形(Full/Half Shape)輸入的逗號都是“,”(U002C)。
“單/雙字節(jié)字形”和“半/全形字形”在Unicode 標準中稱為“半寬和全寬字形”(Halfwidth and Fullwidth Forms)。把同一個字母的半寬和全寬字形分開編碼,這也是一種同形異碼現(xiàn)象。Unicode 的全寬拉丁字母(Fullwidth Latin Letters)表的網(wǎng)址是http://www.unicode.org/charts/PDF/UFF00.pdf。收錄有一百多個字符,包括字母、數(shù)字和標點符號等。
如果全寬和半寬字形的應用是為了文字排版外觀的需要的話,則大可不必動用兩套代碼,用字體或字型(font)技術(shù)實現(xiàn)就行了,類似于楷體字和宋體字的處理方法。
一般而言,同形異碼字是信息處理的累贅。最徹底的解決方法是通過代碼整理,盡量使得每一個中文字符對應一個Unicode代碼,類似于漢字規(guī)范工作中的異體字整理[12]。應該在同形異碼字的幾個編碼中選用一個作為該字的正碼而淘汰其它的異碼。關(guān)于如何選擇,上文針對不同種類的同形異碼字已經(jīng)有所交待。
我們提倡使用正碼字符,但是異碼字符不可能馬上銷聲匿跡。因為有些現(xiàn)有的文件已經(jīng)含有異碼字符,而且以后仍有用場,今后產(chǎn)生的文本也有可能出現(xiàn)異碼字。換句話說,中文信息處理在相當一段時間內(nèi)仍會遇到同形異碼字問題。對于含有同形異碼字的文本,可考慮以下處理方法。
1) 在數(shù)據(jù)層面上,可研制專門的代碼轉(zhuǎn)換程序,將含有同形異碼字的文本預先轉(zhuǎn)換成純正碼后再作其他處理。例如,將所有的Unicode為 F9E4的兼容字“理”都改為U7406的Unihan正碼字 “理”。
2) 在程序?qū)用嫔?,可以在信息處理軟件中加入同形異碼字處理功能,使得無論用戶用哪一個異碼查檢,計算機都會找到所有的同形字符。例如,當用戶用Unicode 7406 或 F9E4 的“理”檢索時,計算機都會把兩種代碼的“理”都找出來。目前許多重要應用軟件都未具備這種功能。我們在Google上搜索含“理” (U7406)的“理工”和含“理”(UF9E4) 的“理工”,得到的結(jié)果數(shù)目分別是約165 000 000 條和224 000 000條。百度的搜索結(jié)果也不同。而Word 2010在尋找(find) "理”(U7406)時, 則明顯地忽視了“理” (UF9E4)。圖3是Word在本段文字上的搜索結(jié)果屏幕剪影。
圖3 Word在本文上段文字中尋找"理”(U7406)時忽視了“理”(UF9E4)
在 jfj漢字簡繁體轉(zhuǎn)換軟件中,為了解決同形異碼字問題,轉(zhuǎn)換字典收錄了與每個字碼對應的繁簡體字對。例如,既收字對“罸(U7F78)- 罰”,也收“罸(UEE05)- 罰”[13]。
3) 在用戶層面上,首先,應該考慮讓用戶根據(jù)需要來設(shè)置是否區(qū)分同形異碼字。在這方面,Excel 2010 的處理方法值得我們參考: 當用戶選擇區(qū)分大小寫字母(Match case)時,只匹配同碼字;不區(qū)分大小寫字母時,則匹配所有同形異碼字。此外,還需要更好地利用Unicode 的規(guī)范表達式(Normalization Forms)技術(shù)[7]。 可以建立一個較為全面的同形異碼字表,以便用戶在使用信息處理軟件時考慮到同形異碼字的各個代碼。例如,在Word 2010文檔上尋找“理”字時,既尋找 U7406的“理”,又尋找 UF9E4 的“理”,然后將兩部分結(jié)果綜合起來。
最根本的解決方法是Unicode 本身的改善,盡量消除同形異碼,做到字-碼一一對應。中日韓漢字兼容區(qū)的異碼字如果實在有需要保留,可考慮在字形上加標記(例如用較小的k表示韓語專用),以免誤用于其它場合。此外,應該盡量少造字,不造計算機上已有的字。私人用字一旦納入公共編碼供大家使用,就立即停止使用私人造字時所用的代碼。另外,還要改善中文輸入法等文本生成軟件,使計算機上新產(chǎn)生的中文字符都使用優(yōu)選的漢字代碼。
同形異碼字同一個字符擁有兩個或兩個以上的計算機代碼,不僅浪費代碼資源,還會直接影響語言文字應用與研究。例如,我們在前文已經(jīng)看到,同形異碼字的存在使得計算機檢索不到完整的信息,使得某些漢字的繁簡體轉(zhuǎn)換被遺漏。關(guān)于同形異碼字的討論還未見有文章發(fā)表,上文主要討論了同形異碼字的不同類型及其相關(guān)問題的解決方法,希望能起拋磚引玉的作用。下面補充幾點說明和討論。
本文使用的語料實例主要來自香港、澳門和Unicode官方網(wǎng)站,但其影響并不局限于這三個方面。在中國兩岸四地文化交流不斷發(fā)展,中文信息處理日益國際化的今天,地區(qū)性的問題很容易影響到外地。例如,《香港增補字符集》的字可能會傳到外地,港澳政府的工作報告也可能會作為重要文件被收入臺灣、內(nèi)地或國際的現(xiàn)代漢語語料庫。Unicode CJK 兼容表意文字中有許多是不同地區(qū)的共有常用字,例如,“理”、“領(lǐng)”、“車”等。而非漢字的中文字符在國際中文教學與應用中也起到相當重要的作用。
中文之外的字符也存在同形異碼現(xiàn)象。例如,瑞典語、丹麥語和挪威語的字母?的Unicode是00C5,?的Unicode是212B。又如x2和x2的下標“2”的代碼分別是U2082 和U0032,前者使用了專門的下標字符[14],后者是傳統(tǒng)ASCII字符的下標格式。此外,上文已經(jīng)提到過,英文字母的全寬和半寬字符(fullwith and halfwith)也使用不同代碼,例如,全形的A(UFF21)和a(UFF41), 半形的A (U0041)和a (U0061)。因此,本文的討論對于了解和處理中文之外其它語種的同形異碼問題也有參考價值。
與同形異碼相對應的是同碼異形問題。有一些漢字新舊字形用不同代碼。例如,戶(U6237)-戶(U6236), 術(shù)(U672F)-朮 (U672E),強(U5F3A)-強(U5F37); 但是也有一些新舊字形用相同的內(nèi)碼,例如: 骨(U9AA8)-骨(U9AA8),辶(U8FB6)-辶(U8FB6),反(U53CD)-反(U53CD),襁(U8941)-襁(U8941) (這里的異形是通過使用SimSun 和 MingLiu字體來實現(xiàn)的)。其中最令人費解的是“強(U5F3A)-強(U5F37)”異碼,而“襁(U8941)-襁(U8941)”卻同碼。這種不一致現(xiàn)象也是Unicode不盡如人意的地方。
看來Unicode在統(tǒng)一取代ASCII, GB和Big5等其他代碼標準的同時,其內(nèi)部也需要進一步統(tǒng)一完善,盡量減少沒有必要的或得不償失的同形異碼現(xiàn)象[15],以便在計算機語言信息處理中更好地發(fā)揮作用。
[1] 曾蔭權(quán). 中華人民共和國香港特別行政區(qū)政府二零一一至一二年施政報告:繼往開來[R]. http://www.policyaddress.gov.hk/11-12/chi/pdf/Policy11-12.pdf.2011
[2] 香港政府資訊科技總監(jiān)辦公室(2008). 香港增補字符集[S]. 香港:政府資訊科技總監(jiān)辦公室http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/hkscs/.
[3] 陳壯. 中國在ISO/IEC JTC1/SC2 的活動與中文編碼的國際標準化[J]. 中文信息學報, 2007,21(4).
[4] Google. Unicode Over 60 Percent of the Web [EB]. Posted on Google Official Blog by Mark Davis, International Software Architect, http://googleblog.blogspot.hk/2012/02/unicode-over-60-percent-of-web.html 2012.
[5] 張小衡,李笑通. 一二三筆順檢字手冊[M]. 北京: 語文出版社. 2013.
[6] 崔世安. 中華人民共和國澳門特別行政區(qū)政府二○一二年財政年度施政報告[R]. http://portal.gov.mo/web/guest/info_detail?infoid=134838.2011.
[7] The Unicode Consortium (2012a). The Unicode Standard, Version 6.2.0 [S], Mountain View, CA: The Unicode Consortium, http://www.unicode.org/versions/Unicode6.2.0/
[8] The Unicode Consortium (2012b). CJK Radicals, the Unicode Standard 6.2.0 [S]. http://www.unicode.org/charts/PDF/U2F00.pdf
[9] The Unicode Consortium (2012c). CJK Radicals Supplement, the Unicode Standard 6.2.0 [S]. http://www.unicode.org/charts/PDF/U2E80.pdf
[10] The Unicode Consortium (2012d). CJK Strokes, the Unicode Standard 6.2.0 [S]. http://www.unicode.org/charts/PDF/U31C0.pdf.
[11] Zhang, X. Computer Input of Non-ASCII Non-Hanzi Chinese Characters [J]. The Journal of Modernization of Chinese Language Education (中文教學現(xiàn)代化學報), 2012(2).
[12] 傅永和. 漢字規(guī)范化60 年[J]. 語言文字應用. 2009(4).
[13] 張小衡. 一個支持人工校對的中文簡繁體轉(zhuǎn)換工具[C]. In 孫茂松, 陳群秀編, 中國計算語言學研究前沿進展 (2009-2011). 北京:清華大學出版社, 2011: 569-575.
[14] The Unicode Consortium (2012f). Superscripts and Subscripts, the Unicode Standard 6.2.0 [S]. http://www.unicode.org/charts/PDF/U2070.pdf.
[15] Whistler K. On the Encoding of Latin, Greek, Cyrillic, and Han. Unicode Technical Note #26 [R]. http://www.unicode.org/notes/tn26/tn26-2.html.2010.
[16] The Unicode Consortium (2012e). Latin-Extended B, the Unicode Standard 6.2.0 [S]. http://www.unicode.org/charts/PDF/U0180.pdf.
Duplicate Encoding of Chinese Characters
ZHANG Xiaoheng
(Dept. of Chinese & Bilingual Studies, Hong Kong Polytechnic University, Hong Kong, China)
A duplicate-encoded character is a character which has been assigned two or more code points in a coding system such as Unicode. When output in distinct codes, the glyphs of a duplicate-encoded character appear the same to human users, while in the computer, they are different characters. Such a human-computer inconsistency would cause confusion in language information processing, resulting in incomplete information retrieval, inaccurate statistic calculation, and inferior quality of data sorting and categorizing. This paper discusses duplicate encoding of Chinese characters in Unicode, MS Office and the WWW, including (a) duplicate encoding arising from new code assignment in the Unihan public area to characters already encoded in the private use area, (b) duplicate encoding caused by compatibility encoding, (c) duplicate encoding brought forward by building dedicated lists for CJK strokes and radicals, and (d) duplicate encoding of characters in half-width and full-width forms. Some effective solutions to the problems are also suggested.
Chinese characters, duplicate encoding, unicode
張小衡(1958—),助理教授、博士,主要研究領(lǐng)域為計算語言學、計算機輔助漢語教學和現(xiàn)代漢字學。E-mail:ctxzhang@polyu.edu.hk
1003-0077(2015)04-0144-07
2013-09-27 定稿日期: 2014-04-17
PolyU RGC Direct Allocation Fund. Project Account Code; A-PK14
TP391
A