雷 勵
(興義民族師范學院, 貴州 興義 562400)
利用計算機數(shù)據(jù)庫來研究《集韻》等韻書具有特殊性?!都崱纷鳛樵嘉墨I與計算機數(shù)據(jù)庫的存在方式有著本質(zhì)的不同。前者雖為刻本,但仍以書寫的形式存在。計算機數(shù)據(jù)庫采用結(jié)構(gòu)化信息模型,以格式化編碼的形式存在于存儲介質(zhì)之中,而韻書數(shù)字化過程便是把以字符為內(nèi)容的記錄以結(jié)構(gòu)化形式輸入計算機數(shù)據(jù)庫。
計算機內(nèi)字符是以編碼的形式存在的,用單個、兩個或四個字節(jié)(Byte)來記錄一個字符(Character),所有字符編碼的集合就是字符集(Charset)。根據(jù)字符集編碼的范圍、結(jié)構(gòu)、方式及所含編碼字符的多寡可以分為不同的字符集,常見的字符集就有 GB2312、GBK、GB18030、ISO/IEC 10646等。我們在創(chuàng)建《集韻》數(shù)據(jù)庫時基于Windows 7操作系統(tǒng)和MS Access 2007數(shù)據(jù)庫,使用Unicode編碼規(guī)范,以ISO/IEC 10646為字符集標準。
ISO/IEC 10646被譯為“通用多八位編碼字符集”,該通用字符集共定義了17個代碼平面(Code Plane),代碼范圍由 U+000000~U+10FFFF,每個平面均由 65,536(256×256)個碼點(Code Point)組成①,每個平面的最后兩個編碼(OxFFFE、OxFFFF)不用。00平面(Plane 00)被定義為基本多文種平面(Basic Multilingual Plane,簡稱BMP),可用UCS-2表示,即使用16位碼元(2個字節(jié)),如拉丁字母大寫“A”編碼為U+0041。其余16個平面為輔助平面(Supplementary planes),代碼范圍U+10000~U+10FFFF。
ISO/IEC 10646所定義的16個輔助平面超出了UCS-2的字符編碼表示范圍,需要使用兩個16位碼元表示,又稱代理對(Surrogate Pair)。00平面的U+D800~DFFF編碼范圍被用作UTF-16代理編碼段,U+D800~DBFF被用作高位代理(或稱前導代理),U+DC00~U+DFFF被用作低位代理(或稱后位代理),高位、低位代理組合最多能表示400H×400H=1,024×1,024=1,048,576個碼點,與16個輔助平面的編碼范圍重合(65,536×16=1,048,576)。
我們再舉例說明Windows NT內(nèi)核系統(tǒng)中的字符編碼。打開Windows 7系統(tǒng)自帶文本編輯工具記事本,在文本編輯框中輸入“”(U+2A00A)字,以Unicode編碼保存,再用純文編輯工具UltraEdit以二進制方式打開所保存的文件,可得該文件的十六進制代碼為:
FF FE 68 D8 0A DC
FF FE放在文件開頭指示字符編碼順序,表示字符以UTF-16 LE編碼,即為字節(jié)順序標記(Byte Order Mark,簡稱 BOM)??傻谩啊保║+2A00A)字的UTF-16編碼為:
D868 DC0A
高端代理OxD868轉(zhuǎn)為二進制為1101 1000 0110 1000;
低端代理OxDC0A轉(zhuǎn)為二進制為1101 1100 0000 1010。
取高端代理OxD868二進制碼元右十位0001101000,再取低端代理OxDC0A二進制碼元右十位0000001010,然后合為二十位二進制碼元0001 1010 0000 0000 1010,轉(zhuǎn)為十六進制編碼為 Ox1A00A,再加上Ox10000(輔助平面起始碼點),則可得出“”字編碼為U+2A00A。
我們又以同樣的方式,在MS Word、Excel、Access中編輯輸入“”(U+2A00A)字并存為97-2003格式的.doc、.xls、.mdb文件,用 UltraEdit工具以二進制方式打開所保存的文件,得字符代碼段為“68 D8 0A DC”,說明文件均以UTF-16編碼存儲。
EF BB BF F0 AA 80 8A
EF BB BF為UTF-8編碼文件前部的BOM。可得“”(U+2A00A)字的UTF-8編碼為:
F0 AA 80 8A
“”字的UTF-8編碼轉(zhuǎn)為二進制為:
11110000 10101010 10000000 10001010
眾所周知,計算機是通過機內(nèi)編碼進行處理、存儲、交換信息的,但字符編碼本身不具有形態(tài)顯示,這就需要字體文件顯示編碼字符內(nèi)容。目前盛行的字體文件類型是TruetypeFont(TTF),它由Apple和微軟公司共同開發(fā),是一種矢量字體,利用二次曲線描寫字形輪廓②。TTF由head、cmap、glyf、loca、post等一系列數(shù)據(jù)表構(gòu)成,即對編碼字符的字樣屬性進行描述。顯示編碼字符時,系統(tǒng)函數(shù)會讀取相應字體文件,通過字體文件中的cmap數(shù)據(jù)表查找與字符編碼相應的像素索引(或稱字形索引),以像素索引為條件檢索并返回相關(guān)字形參數(shù)。之后便再把返回的參數(shù)值存儲到相應程序的緩存中去,并通過操作系統(tǒng)Gdi函數(shù)在窗體中繪出文字圖形③。
綜上所述,編碼是字符在計算機內(nèi)的唯一身份,對字符進行數(shù)據(jù)處理即是針對字符編碼而言的。計算機字形是對編碼字符的圖形顯現(xiàn),而字體是字形的屬性表,是對字形的數(shù)據(jù)描述。在Unicode編碼空間里,碼點不會因未分配字符而空缺,比如,0F平面的OxFAAAA碼點暫無字符分配,但碼點依仍存在。例如,我們可在MS Word中輸入并選定“FAAAA”,按Alt+X鍵,編碼會轉(zhuǎn)換成“□”符號,即表示無字符顯示。但并非所有顯示為“□”的碼點都沒有分配字符,因為編碼字符需要用字體文件顯示。如02平面(SIP)的字,系統(tǒng)中若未安裝能顯示02平面編碼字符的字體,則仍顯示為“□”。如需顯示ISO/IEC 10646編碼字符集外的字符時,也可先在0F平面(PUA)內(nèi)指配碼點④,并用FontCreator字體軟件修改支持0F平面(PUA)的TTF字體,新增字模和字形索引,并編輯該字形。當然,Windows操作系統(tǒng)在顯示02平面(SIP)至0F平面(PUA)的字編碼字符,須在注冊表中關(guān)聯(lián)。
在整理漢字字形時,亟需漢字構(gòu)形學理論對個體漢字進行分析,特別是應該引入字位、字樣、書寫變體、傳承變體以及形位、形素等范疇來對漢字字符間進行共時、歷時兩個軸向的系統(tǒng)分析。字符集編碼空間畢竟有限,如果字形凡有差別就分配碼點,則現(xiàn)有的17個平面編碼空間仍然不夠用,這顯然不符合經(jīng)濟性原則。當然,從古籍排印及漢字字符信息處理的角度來說,如需保存古籍原貌,自當體現(xiàn)原書字形的所有差別。
ISO/IEC 10646字符集中各編碼字符有不同的字符來源(Sources of characters),統(tǒng)一的編碼字符規(guī)范是在各國、各地區(qū)文字規(guī)范標準等基礎上制定的。CJK認同表意文字(CJK Unified Ideographs)編碼表中沒有指定編碼漢字的代表字形,但列出了中國大陸、臺灣、香港、澳門及日本、韓國、越南、新加坡等地區(qū)各信息交換標準中所規(guī)范的字形,并標注了字形的來源參數(shù)⑤。同時在收錄整理字符時,為了避免字符重碼,ISO/IEC 10646標準還定義了表意文字認同規(guī)則⑥。
根據(jù)該認同規(guī)則,應被認同的漢字字形只指配一個字符編碼,也即認同為同一個編碼字符。對字形近似的非同源漢字(non-cognate characters)字形則分別編碼,如“士”(U+58EB)和“土”(U+571F),再如“朏”(U+6723)和“胐”(U+81A7)。認同規(guī)則還定義了兩個步聚:對構(gòu)字部件間結(jié)構(gòu)的分析(Analysis of component structure)、對構(gòu)字部件特征的分析(Analysis of component features)。構(gòu)字部件特征的分析又包括構(gòu)件數(shù)量、相對位置、下位構(gòu)件及其結(jié)構(gòu)等方面的比較分析。認同規(guī)則還規(guī)定:構(gòu)字部件層面的差異以及構(gòu)件間的結(jié)構(gòu)關(guān)系、位置關(guān)系的差異不作認同,如“崖”“、厓”“,峰”“、峯”“,夾”、“夾”等字形之間的差別;對于同源漢字,若僅在筆畫等形素上有細微差別,則可作認同處理,認同規(guī)則中還列舉了筆畫出頭、相交、相連、帶鉤等11類實例,如“”、“”,“”、“”等。
為保持中國大陸、臺灣地區(qū)、韓國、日本等地區(qū)信息標準交換碼的完整性,ISO/IEC 10646表意文字認同規(guī)則還列出了對所含字符不作認同的4組信息交換標準,并附有舉例說明。例如“,刃(U+5203)、刄(U+5204)(U+2F81E)”在 ISO/IEC 10646字符集中分別占有3個碼位,“刄、”為“刃”字的字樣變體,若依認同規(guī)則,本應合并為一個編碼字符,分別編碼主要因其分屬不同地區(qū)的標準字符集。又GB2312與CNS 11643-92部分字符的字形完全相同,但ISO/IEC 10646在02平面仍給CNS 11643-92的這部分字符分配了碼點,如“ ”字就有U+4039、U+2F949兩個編碼。這些字符被分別編碼,當然不能歸類于字位層面的收錄整理。編碼字符是一個二維平面的字符序列,每個編碼字符不一定都等同于字位,線性的編碼序列如何更好地體現(xiàn)字位及字樣層位關(guān)系需待更深入研究。
在古籍數(shù)字化的過程中,自始至終都存在字樣提取和整理的過程。對整理程度的不同要求,也造成了字符認同程度的不同。例如,對異體字的處理便涉及是否應改換為現(xiàn)行規(guī)范字形以及劃定異體字改換范圍等方面的問題。尉遲治平也認為:“為了正確認識和處理數(shù)碼漢字的異體問題,必須引入字位的概念?!盵2](p.121)尉遲還提出整理古籍時應先從字位的概念出發(fā),甄選通行字作為代表字。一般來說,對字樣的提取和整理,應該根據(jù)古籍處理的目的和學術(shù)研究的需要,制定相應的標準,針對古代韻書收字的整理研究,應該采取較嚴的標準,亦即充分體現(xiàn)字形的差別,尤其是對韻書中字頭的字樣提取和整理。我們提取和整理字樣時必須堅持以下兩條原則:一是字形的差別若是反映了記詞功能的區(qū)別,那么即使是再細微的差別,也不能將之認同為一個字符;二是在字樣提取和整理的過程中,字符的認同或區(qū)分,必須使用統(tǒng)一與連貫的標準,不能出現(xiàn)前后矛盾和不一致的情況。
韻書字樣的提取與整理是創(chuàng)建韻書全文數(shù)據(jù)庫的基礎,所謂字樣提取就是把字樣輸入計算機而錄為編碼字符的過程。我們按原書順序提取《集韻》字頭字樣時,常以形碼(五筆輸入法)檢索編碼字符。例如,平聲東韻的“”字,其五筆形碼為:GJII。通過五筆碼,可檢出“東”(U+6771)字,之后在《集韻》數(shù)據(jù)庫中輸入編碼字符“東”記錄該字頭,并錄入其字符編碼U+6771。
在提取《集韻》字頭字樣時,我們盡量采用字形完全相同的編碼字符錄入,以保持原書字形。例如,平聲寒韻的“刋”字,《集韻》潭州本、明州本、金州本分別作“”、“”、“”,注“《說文》:剟也”。按:《說文·刀部》小篆形作“”?!洱堼愂昼R·刀部》作“刋”,注“口干反。刋定,除削也”。ISO/IEC 10646字符集內(nèi)相應的編碼字符有“刊”(U+520A)和“刋”(U+520B)2字,今“刊”為通行字。我們在提取字樣時,字頭記錄為“刋”,并在相關(guān)字段中再輸入“刊”,以溝通其與通行字之間的關(guān)系。再如,上聲語韻的“呂”字,《集韻》潭州本、明州本、金州本分別作“”、“”、“”,注“《說文》:脊骨也。昔太岳為禹心呂之臣,封呂侯。或從肉、旅。一曰:呂,陰律。亦姓”。按:《說文·呂部》小篆作“”,《王三》作“呂”,《切三》、《王二》均作“呂”。《九經(jīng)字樣》云“:呂,隸省作呂?!雹逫SO/IEC 10646字符集內(nèi)相應的編碼字符有“呂”(U+5415)和“呂”(U+5442)2字。我們在提取字樣時,字頭記錄為“呂”,并在相關(guān)字段中再輸入“呂”,以溝通它們的關(guān)系。
還有一些字樣,字形構(gòu)件本不混同,分別有不同的來源,但《集韻》所錄已經(jīng)不作區(qū)別。為保持《集韻》原書面貌,我們?nèi)赃x擇與《集韻》字樣相同的編碼字符輸入。例如,平聲文韻收“頒、朌”3字,《集韻》潭州本、明州本、金州本所收“朌”字分別作“”、“”、“”,并注“大首皃。一曰:眾皃。或從肉。亦作”。按:《正字通·肉部》“月”字下注“肉字偏旁之文本作肉。石經(jīng)改作,中二畫連左右,與日月之月異。今俗作 以別之”。ISO/IEC 10646字符集內(nèi)相應的編碼字符有“朌”(U+670C)“、肦”(U+80A6)2字,我們在提取字樣時,字頭仍記錄為“朌”(U+670C)。
當然,計算機編碼字符的字形不盡與《集韻》字頭重合,如在字符集中挑不出字形完全相同的編碼字符,便以ISO/IEC 10646字符集標準中的表意文字認同規(guī)則為參照,并在漢字構(gòu)形學理論的指導下,通過深入分析字符間的字形、字構(gòu)、字用的異同,逐一確認字樣與編碼字符的對應關(guān)系。若字形間的差別標記了記詞功能的不同,則必作區(qū)分。例如“,”字豎筆帶鉤,而編碼字符集中的“東”字豎筆不帶鉤,而該字形差別并不影響記詞功能,根據(jù)認同規(guī)則,對此差別可以不作區(qū)分。對于ISO/IEC 10646字符集內(nèi)無相應編碼字符的《集韻》字樣,可在0F平面內(nèi)分配碼點,并在相應字體中新增字模。例如,《集韻》平聲齊韻收“睽、”2字,注“乖也。古作”。我們在0F平面分配U+F007C碼點給“”字,而字體中所新增的字形作“”。
《集韻》有的字樣在ISO/IEC 10646字符集中僅有記詞功能雖相同而字形稍異的編碼字符與之對應,為減少在系統(tǒng)字體中新增字模的工作量,我們一般就以本編碼字符記錄《集韻》字樣,同時也在相應的備注字段中記錄該差別。例如,平聲脂韻收“、葵”2字,注“:《說文》菜也。隸作葵。”按:《說文·艸部》小篆作“”。《集韻》“”乃“”字的隸定形體。ISO/IEC 10646字符集內(nèi)字形相近的編碼字符有“”(U+26B99)。而“”、“”字形差別僅在于前者從“艸”、后者從“ ”?!捌H”與“ ”的構(gòu)件功能本同,因此我們在提取字樣時,字頭記錄為“”(U+26B99)。再如,《集韻》平聲支韻收“爲、”2字,注“古作”。按:《說文·爪部》“:,古文爲。象兩母猴相對形?!薄蹲謪R補·臼部》“:,古文爲字?!眲t“、”均可視為“”字的隸定形體。ISO/IEC 10646字符集內(nèi)字形相近的編碼字符有“”(U+223FD)“、”(U+2696E)2字,而“”與“”字形貌似更近,因此我們在提取字樣時,字頭記錄為“”(U+223FD)。
為準確展現(xiàn)《集韻》字頭字樣,也可按《集韻》原書順序建立數(shù)據(jù)表,同時截取原書字樣的字圖,并存為位圖文件,而字樣位圖文件可按【碼點+字頭順序】的格式命名。然后再以與字樣對應的編碼字符碼點為數(shù)據(jù)表主鍵,建立編符字符與字圖的關(guān)聯(lián)。
字樣的提取在韻書數(shù)字化的過程中處于關(guān)鍵性地位,它直接影響到韻書相關(guān)研究成果的準確性。計算機編碼字符與原書字樣的字形總會有不同之處,誠然我們也可以修改字體數(shù)據(jù)使編碼字符的字形屬性與之契合,但編碼字符與碼點的映射以及編碼字符間所體現(xiàn)的區(qū)別與聯(lián)系總是固定的。字樣提取和整理,也就是對字符進行認同與辨異。一方面,我們可利用漢字構(gòu)形學理論,從字位與字樣的角度對原書字樣進行提取和整理;另一方面,我們也應該盡量地保持韻書原貌。而數(shù)字化過程中所遇與原書不相符之處,應詳細記錄。
注釋:
①Unicode標準指出:用來對抽象文字進行編碼的整數(shù)范圍稱為編碼空間;這個編碼集里的每個特定編碼叫做碼點;當一個抽象字符被映射或被分配到編碼空間中特定的碼點時,這個抽象字符就被稱為編碼字符。參見 《The Unicode Standard,Version 6.2》,Unicode Consortium,第 22頁。
②微軟又和Adobe公司共同開發(fā)了Open-Type字體,以三次曲線來定義字形,相比二次曲線,可以用更少的點來描寫同樣的曲線。
③MS Word嵌入字體保存即是通過讀取字體數(shù)據(jù),并把數(shù)據(jù)寫入文件,方便其他無相關(guān)字體的計算機也能正常顯示所有字符。
④ISO/IEC10646定義0F、10平面保留為專用平面(Private Use Plane),又簡稱 PUA。
⑤見《ISO/IEC10646:2012 Information technology—Universal Coded Character Set(UCS)》,ISO,第 35-37頁。
⑥認同規(guī)則原文見 ISO/IEC 10646 Annex S(Inform ative)Procedure for the Unification and Arrangem ent of CJK Ideographs。香港又稱“漢字統(tǒng)一整合規(guī)則”。
⑦見《隸辨·上聲·語韻》卷三“呂”字注文。
[1]楊小衛(wèi).計算機技術(shù)在古代文獻整理和學術(shù)研究中的應用——《集韻》的XML建模和處理[J].信息科技,2010(10).
[2]尉遲治平.電子古籍的異體字處理研究——以電子《廣韻》為例[J].語言研究,2007(3).