出人意料的漢字字形顯示問題——關于“趙孟頫”的那筆糊涂賬
無論是我們在翻閱實體書或其他實物印刷品時,還是在瀏覽電子書、網頁、使用輸入法輸入文字時,都會經常遇到某些文字的字體明顯和它前后其他文字不一樣的情況。
一個故意改變字體的有趣例子,出自群眾出版社 2006 年版《古拉格群島》。
除了極少數刻意改變字體的案例,更多情況是因技術限制而直接“棄療”,大多數文字字形問題都有著復雜的歷史和技術原因。我們常以為這些問題很容易解決,但實際上遠非如此。
電子版《越南概論》中“左口右從”的直接棄療行為。
例如使用Word等文本編輯器時,可以很容易地給一個字體調整格式,如加粗。在字體設計中,筆畫的粗細程度稱為“字重”(font weight)。
但是與我們的“常識”大相徑庭的是,在專業的排版軟件中,這種看似簡單的改變同一個字形字重的操作反而是不行的。如果我們使用的字體沒有專門的“字重”設計的話,比如我們常見的字體“書宋”“楷體”“報宋”,那么排版人員即使想要簡單地把一個字形變粗或變細一點點,都需要替換成另外相近的字體。有編輯甚至因為這種不得不為之的變換字體、字體無法統一的問題,導致自己編輯的圖書被讀者投訴為“印刷質量有問題”。
圖源 臺灣地區歷史語言研究所《古文字與古代史(第一輯)》,一個因改變字體即需另行專門造字的實例。
周嘯天《唐詩鑒賞辭典》此頁電子版中體現的是另一種常見情況。簡化“糹”后的“緌”字形無法正常輸入和顯示,出版方最后只得選擇了使用一張圖片代替的方式解決。
周嘯天《唐詩鑒賞辭典》電子版中的一頁,簡化“糹”后的“緌”字形無法正常顯示,出版方只能自造一張圖片代替之。
而規范字形應為“兆”+“頁”的繁體字“頫”,因為“趙孟頫”這個人名的高頻出現,一度成為此類涉及繁體漢字簡化問題中最典型的“問題字”之一。
王寧主編《通用規范漢字字典》中的相關條目
在 2013 年《通用規范漢字表》推行后,“頫”的類推簡化字“正式”成為規范漢字,趙孟頫更是無法起自己于地下,像錢鍾書堅持自己名字中的“鐘”字應寫作“鍾”一樣反對“頫”的簡化。
雖然《出版物漢字使用管理規定》中有“法律、歷史、傳統等特殊需求如人名、地名,能夠使用繁體字”之類的條例,但依然有編輯反映,她們工作中的遇到的檢查標準往往是“不允許混用繁簡漢字”。
《現代漢語詞典》(第 7 版)中已經收錄了“頫”的類推簡化字。
這是因為“頫” 的類推簡化字已為《現代漢語詞典》收錄,為避免被后續質檢或抽檢為“差錯”,所以他們在遇到這個著名的人名時,為保險起見,一般是不敢保留繁體的“頫”的。
左圖紅圈中為出版方自造的“頫”簡化字,右圖劃線處保留了“頫”字的繁體字形。
可是麻煩的地方在于,“頫”的類推簡化字成為規范漢字并不意味著它也成了一個可以像“正常”的漢字一樣,在排版文件中輸入字形編碼的漢字。上圖左半紅圈中的“頫”簡化字,雖然看起來字體似乎與其他文字沒有什么區別,但實際上這個簡化后的“頫”字是無法直接在出版方的排版文件中輸入的,乃是出版方的自造字。此自造字不易被察覺,僅因其構形簡單。其實造出這個字形非常容易——任何沒有受過專門訓練的讀者都可以自行完成,打開InDesign 軟件,我們只需調入“兆”和“頁”兩個字形,壓縮它們,并縮短間距后拼接起來即可完成。這樣簡單的字形是很容易造到“完美”得肉眼難以辨別的。
它實際上有著自己的標準 unicode 編碼,可是很多時候依然無法正常輸入、顯示。
不僅如此,這個類推簡化字實際上是擁有 Unicode 標準編碼“U+2 B5AF”的,但莫說通行的排版軟件,我們使用的一般輸入法都依然無法直接打出,而且在多數情況下,它甚至在網頁頁面中也無法正常顯示。
要想徹底搞清楚這筆看起來千頭萬緒的糊涂賬,我們首先需要了解一點點漢字編碼及字形存儲和顯示的基本原理。
現實中根本沒有這個字,卻有自己通用編碼的神奇“幽靈漢字”
當我們通過某種輸入法輸入漢字時,首先會被計算機映射為一種它直接“認識”的編碼,亦即字符集內部標準編碼,簡稱內碼。 比如最早的內碼ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼),它的設計邏輯基于拉丁字母,主要是為了解決現代英文的標準編碼問題創制的。
ASCII 碼表
為了便于識讀,ASCII編碼通常記作十或十六進制,比如字母“A”的碼位可能會被表示為65或41,但是它在計算機內部儲存的實質上是一個八位的二進制編碼 0100 0001。因為現代計算機系統以字節(8位)為單位存儲,所以7位二進制編碼前要補一個0湊足八位。很容易理解,ASCII的編碼空間范圍為0000000~1111111,它一共可以表示的編碼總數量只有128個(2的7次方)。
但只有英文內碼顯然是不夠的,其他國家、文字顯然也需要一套自己的內碼。而現今全球最通用的內碼Unicode就是這么一套號稱為所有語言中的“每個字符”都分配了唯一對應編號的碼位。
在有這么大雄心和這么多需要編碼的符號的情況下,原來的編碼空間自然就不夠用了。1991年Unicode 1.0誕生時采用固定的16位編碼,Unicode的碼位一般以U+前綴表示,所以有216(U+0000 ~ U+FFFF)=65,536個碼位。
Unicode 代碼分配示意圖,圖源《中文信息處理技術》
這65536個碼位一一映射的字符覆蓋了包括中文在內的當時幾乎所有主流語言的字符,我們一般叫它基本多文種平面( BMP, 又稱為 Plane 0 )。而其中的漢文字符編碼部分,我們通常稱之為CJK(CJK Unified Ideographs,中日韓統一表意文字)區塊,一共20992個漢字字符進行了編碼。
在普通語言學領域,關于漢字是否屬于“表意文字”(ideograph)以及這一分類本身的合理性,學界存在顯著爭議。周有光、裘錫圭等權威學者都認為從文字系統的構形本質來看,漢字的性質可定義為“意音文字”(logographic-syllabic writing),純粹的“表意文字”根本不存在。但是在自然語言處理(NLP)領域,從CJK的名稱“中日韓統一表意文字”就可以看出,漢字毫無疑問是被看作為一種表意符號的。更準確地說,漢字被認為是一種視覺-語義單元,所以其編碼系統的設計邏輯的確與類似英語的拼音文字有著根本性的差異。
格外值得注意的是,CJK 并不僅僅涵蓋內地使用的漢字,還囊括了包括日本國語漢字、和制漢字,韓國韓文漢字,越南喃字,臺灣地區和香港繁體漢字等其他使用漢字國家/地區的字形符號,甚至還包括了很多中國少數民族文字的編碼,比如西夏文、契丹小/大字、女書等等等。
一個著名的只存在于 Unicode 里的幽靈漢字:彁
這種跨地區的標準和早期制定標準流程的粗疏會導致出現一些匪夷所思的離譜情況。由于早期技術限制,手寫錄入地名時因油墨浸染或照片模糊,導致“彊”右半部誤錄為“哥”,最終使“彁”這一錯誤字形被收入Unicode。“彁”就是這么一個著名的只存在于 Unicode 里,但是現實中不存在的幽靈漢字。
導致同一個字字形區別的諸多因素,圖源《中文信息處理技術》
我們很容易想到,很多“漢字”詞在不同語言中可能具有完全相同的字形,Unicode 的編碼不考慮不同語言的語義問題。比如日語中的“娘”(女兒或年輕女性)與漢語中的“娘”(母親)語義完全不同,其編碼卻都是 U+5A18。
那么如果是一個只具有略微差別的字形呢?會導致字形產生細微差別的因素有很多,比如筆畫的方向、長度、曲度的區別,筆畫相交、合并與否,個別筆畫的增減、筆畫方式的差異等。這些不同標準字符集中細微的字形區別,在所謂的“表音文字”字符集中不能說完全沒有,但很少見,可是在東亞表意文字中,這就成了需要妥善解決的核心問題之一。
“劍”字的六種字形變體,圖源《中文信息處理技術》
比如“劍”字有至少如圖所示的六種不同的字形變體,大陸一般用“劍”,日本一般用“剣”,臺灣地區一般使用字形則為“劍”,可是他們的 Unicode 編碼是同一的,亦即只要是字形相似、字源相同、語義相關的漢字,就在同一個碼位上。
字形顯示的基本原理:從離散點陣位圖到參數化曲線矢量圖
Unicode在本質上定義的是字符的抽象身份(Identity),而非它的具體字形。而我們或多或少接觸過的“字體”文件,儲存的就是字符的不同字形。操作系統通過字體文件,把特定unicode碼位的字形渲染出來,就呈現出我們在屏幕上看到的樣貌了。
點陣字形示例圖,同上
作為二維平面圖形,決定漢字字形的要素非常復雜,至少包括有筆畫層面上的基礎筆形(橫豎撇捺鉤等)、動態筆勢(筆畫方向輕重)、空間關系(交叉/相接/斷開)等,構件層面上的相對位置、形變規則(不同偏旁部首組合時大小變化)、嵌套層次,整體層面上的視覺平衡、密度協調、風格等。
在文字處理技術的早期階段,字形信息的數字化記錄的通用解決方案是離散點陣位圖。其基本技術原理很簡單,即把字形分割為小正方形柵格矩陣,對于其中的每一個點陣單元都可以用坐標記錄其位置,用有色(1)和無色(0)記錄其狀態并對之進行二值化信息編碼。
筆畫矢量壓縮法示例圖,同上
而基于矢量的方案很快后來居上。為二維漢字平面圖形建立笛卡爾坐標系,記錄每個筆畫始點與終點的坐標后,很容易用向量表示所有筆畫和空筆畫的方向與長度。但顯然,如果只有端點坐標的話,筆畫只能被記錄下靜態輪廓,更多的筆勢信息變化是根本無法被記錄的,而用控制點定義平滑路徑的貝塞爾曲線能夠解決這個問題。參數化曲線很快發展成為矢量方案的核心技術。隨著技術的進一步發展,使用二次貝塞爾曲線描述字形輪廓的TrueType(.ttf)和三次貝塞爾曲線的OpenType(.otf)已經成為了現今最通行的矢量字體技術手段和字體文件格式。
ttf、otf 等是現在最通行的字體文件格式
字形的向量就是字體文件儲存的數據,最后屏幕上渲染出的字形則是把向量還原。不難想見,字符集規模巨大、必須多字節表示的漢字系中文字體與拉丁系西文字體不僅在內碼編碼邏輯上有巨大差別,它們的字形數字化方案也判若云泥。一個西文字符一般只需要幾十個控制點即可妥善記錄,但是記錄一般中文字符需要的平均控制點數量是西文字符的十倍之多!
古籍數據庫——漢字是開放集合,永遠無法窮盡
BMP中僅有20902個基本漢字(U+9FA6 至 U+9FFF還包含90個補充漢字),在理論上,這個數量已經能夠覆蓋99%的日常使用場景,但是那看似微不足道的所謂“1%”卻會引發各種各樣的問題。就比如中國人姓名中有非老舊系統無法識別的非基本漢字人口多達6000多萬,他們日常生活的方方面面,曾經都會因為自己起了一個沒有編碼漢字的倒霉名字而受到影響。為那些起初沒有被編碼的漢字字符補辦“身份證”迫在眉睫。
這些社會問題都是BMP外漢字惹的禍!
更“要命”的是,Unicode的偉大愿景遠不止于為現存語言編制字符目錄,它還有著一種近乎史詩般的重要使命:散落在人類歷史長河中的所有文字符號,Unicode 都要為之設計內碼。而歷史曾經存在過的漢字字符何止千千萬萬,其數量之巨大、審定之艱難,都是增補工作的巨大挑戰。
在BMP外的擴展平面中增補漢字字符的工作,主要是由表意文字小組IRG(Ideographic Research Group)負責,截至2024年發布的Unicode 16.0,IRG已經為CJK增補了將近 7萬個漢字字符。
在IRG官網https://www.unicode.org/irg/可以查詢他們的工作情況
但即使擱置IRG引起過諸多爭議的“字理”“字源”等學術糾紛不論,擴展平面內碼在人們日常使用中的最大問題其實是除了BMP中的20902個基本漢字外,其余的增補即使有了編碼,也無法通過一般的輸入法輸入。
知乎用戶“奈白不弍”總結的Unicode中漢字及相關字符所有占用區段
相較于輸入法限制,Windows與macOS的默認字體支持問題更為嚴重。由于它們也僅支持BMP漢字,所以擴展字符在普通用戶的電子設備屏幕上甚至無法渲染字形,這就是“頫”的類推簡化字既無法被一般的輸入法打出,在很多用戶的屏幕上也顯示不出來的根本原因。
即使在專業領域也存在著同樣甚至是更多的麻煩。比如在通行的古籍數據庫中會用到的字,同樣也是即使已經有了編碼,數據庫中能夠調出,但是只要它不在基本平面上,就依然無法進行檢索、查詢、統計等操作,所以實質上與“集外字”沒有區別。所以在實際工作工作中,學者們依然要把這個已有擴展編碼的字符改成一個基本平面編碼,后續的數據處理才能真正開展。
而這些數量已經足夠龐大的字形還僅僅是“楷寫字”,“原形字”則在一個更加復雜、難以數據化的層面上。比如僅僅西周金文“寶”一個字的構形,即高達 1060 個。古文字的數字化開發專家劉志基在《數據庫古文字研究論稿》中指出過:
傳統文字學研究的第一手資料是以印刷、墨拓或抄寫、刻寫等手段形成的紙張等自然物載體形式,資料庫文字學研究的資料是數字化形式的資料庫資源。從查詢檢索的角度看,自然物載體形式的一手資料是以無次序、無條理狀態存在的,因此出于特定研究目的處理,一般都需要人工目驗查找、編輯整理。
其實中國大陸早就組織過古漢字編碼專家參與IRG的定期會議,但漢字古文字編碼的工作依然進展緩慢。或許這些本來就以非標準形態存在的“原形字”更加鮮明地昭示了表意文字的某種根本特征——正如IRG中從事Unicode和OpenType東亞部分相關工作的專家陳永聰指出的那樣,“ IRG的這項工作可能永遠都無法停,因為漢字是一個開放的集合,它永遠沒法完結。”
“永不離職的中華書局員工”——我們這樣造出了本不存在于電腦中的字
如果說編碼問題是理論層面的挑戰,那么古籍排版則是這一沖突在實踐中的集中體現。學者們對專業數據庫的終極期望是為歷史上所有連標準形態都沒有的字形建立起可靠的譜系與可供后續數據處理的標準編碼系統。然而出人意料的是,古籍圖書排版專家的志業卻與之異若霄壤:“補字補字,我們認為我們補的東西根本就不是字,我們只是把需要的圖片給組合出來。我們的員工就沒學過中文的,那些字念什么,是什么意思,我們根本就不懂,也不需要懂。我們補字只是為了方便我們的后續工作,僅此而已,有任何問題都由編輯提出、解決,我們只進行后續的批量操作。”
德彩匯智是國內最專業的古籍類圖書排版公司。諸如中華書局、北京大學出版社等赫赫有名的“古籍出版專業戶”,在自己出版社內部其實幾乎沒有排版員工,其古籍類圖書基本都是交由德彩匯智進行排版的。公司負責人劉慶偉笑稱,自己可以算是“中華書局他們永不離職的員工”。
在他看來,古籍排版是一種市場規模與需求都非常小、技術含量不高、附加值也很低的工作,所以“我就只能用改換形式的方式完成客戶的要求。”
在2005 、2006年前后,中華書局有了自己的照排室,并開始準許社內與社會上的社外人員合作,劉慶偉也正是在這個時候就開始了與中華書局的長期合作。
現今通行的"CTP"(computer-to-plate,直接制版技術)大大降低了排版技術的成本與難度。然而在當年,排版需要把文件先做到膠片上,曬版(曝光)后還需要做到PS版(Presensitized Plate,預涂感光版)上才能成為印刷機可以使用的印版,這就叫激光照排,是一項相當復雜與繁瑣的技術。
劉慶偉還記得當年工作時人人均需常備一本《北大方正漢字內碼字典》,片刻不得離手的情景。那時候的排版人員要想完成工作,是需要自己死記硬背所有待排文字的編碼的,他直言那時做排版“非常受罪”。
《北大方正漢字內碼字典》
圖書排版的本質是圖文設計,里面也可以再細分出很多專門的門類,每個門類的排版都有自己的特點和門道,比如有專做辭書排版的,也有專做雜志排版的、科技類圖書排版的等等,古籍類排版也是其中比較特殊的一塊。
起初劉慶偉不懂行,想著眉毛胡子一把抓,什么類型的排版都干,結果很快發現不同類別的排版技術要求區別很大。更重要的是,最初的時候照排是個非常集中的事情,也是出版社對外合作的一塊重要業務。當時很多出版機構沒有特殊的關系和手段,就很難開啟合作,即使僥幸開啟了也維持不住。但與很多其他排版領域擠都擠不進去的狀況相比,古籍排版卻是壓根幾乎沒人愿意碰。
古籍類圖書的生產周期非常長,一般回款要等到圖書正式出版之后,所以回款周期也特別慢,比如黃天樹《甲骨文摹本大系》一書就耗時整整近十年時間才最終出版。
雖然后來國家出臺了“不得拖欠中小企業款項”的政策使得回款情況有了些許好轉,但利好也僅限于款項需要報備的項目類圖書,如果是非項目類圖書,回款問題則會依然讓人叫苦不迭。古籍排版需頻繁修改,但排版人員僅負責圖文設計,內容審校由編輯完成。所以出版方每重新審校一次返回來的稿子,簡直就跟一本新書一樣。
而古籍排版最麻煩的地方是別說每個出版社、每位圖書編輯,就算是具體到每一本書,他們收到的要求都很不一樣,所以基本無法建立高度標準化、可簡單套用的工作流程。所以德彩匯智最終定下自己的主業,就是僅僅專心服務于少數幾家靠譜的古籍類出版社。雖然客戶是越做越少了,但如果他們建立起自己的專業工作流,這就是一塊別家很難分走一杯羹的市場。
任何稍有古籍文本錄入經驗的人都知曉使用形碼錄入的速度比使用音碼高很多。現代音碼輸入法輸入速度的提升主要依賴于其強大的詞頻記憶與云詞庫功能,但這些功能對于包含有大量的生僻字、以單字詞為主的古籍文本來說,輸入速度的提升可謂收效甚微。以前古籍排版工基本都是使用五筆輸入法的,但隨著時代的變遷,現在已經幾乎找不到可以熟練使用五筆輸入法的年輕人了。但是即便形碼輸入有這么大的好處,他們也依然決定取消員工的五筆培訓環節。這是因為古籍圖書的可服務客戶太少了,它本質上是一個需大于求的市場,提升員工的工作速度也沒更多項目可接,所以提升員工的工作效率對公司來說甚至沒什么真正的意義。而補字,就是古籍圖書排版工作流中最重要的環節之一,難倒是不難,但它是一項格外需要大量經驗與既有成果積累的麻煩事。
在出版行業有三個最主流排版軟件,分別是ID(InDesign),方正書版與方正飛翔,其中古籍排版用的基本上都是方正書版。其實字庫的重要性要高于軟件本身。方正書版最重要的是可以兼容它自己的大型字庫GB方正超大字符集。而且最重要的是方正超大字符集中字形顯示在電子屏幕上是完全正常的,電子閱讀完全不受影響,可是如果用其他的排版軟件和方正的字庫進行印刷,就會出現字體筆畫偏細的問題。而且如果排版部門用的是方正字庫,那些下游的印廠也必須用。方正超大字符集V 2.0的字庫規模更大,但因為價格太高,其實能用得起的排版機構很少。與方正相比,ID雖然兼容的字更多,但是它只能兼容宋體字,變化模式比較少。更重要的是,方正書版的編輯器是非所見即所得(Non-WYSIWYG)編輯器,所以它的編輯速度是明顯快于所見即所得(WYSIWYG)邏輯的ID的。尤其當調入、編輯大文件時,ID僅僅顯示文件的渲染效果都要耗時很久。所以在古籍排版這個行當,如果不是客戶有特別的要求,一般排版都要用方正書版,尤其是如果最后還有進其他數據庫的要求的話。
單純的補字方法就像“頫”的類推簡化字制法一樣簡單,可以拿字形組圖片。組出的圖片叫做圖字,因為圖片是固定高度的,正常的實體書里有大字、小字,圖片只要放大縮小就會出問題,所以圖字是一種比較麻煩的補字方式。方正書版專門的補字插件女媧補字可以在一定程度上避免這些問題,其原理相當于把與一個既有字體編碼對應的字形更換成全新的字形,這個補字可以保留其文本屬性并配適格式變化。當然這個編碼對應的文字只能在方正書版中識別出來,用一般的復制粘貼手段是復制不出來的。
更麻煩的還是字體問題,字體不同的全都要補一個單獨的字,沒那么智能,所以各種字體都得造一個。在補字比例較低的時候,如果字體差別較大就容易看出來,而方正書宋和宋體差別較小,這樣字體上不容易看出區別,就能減少排版時補字的工作量。正因如此,市面上的古籍大多數都是宋體字。
當然古籍排版里面又可以細分為幾類,比如古文字、簡牘、俗字等等,每類又都有自己的難處。比如在簡牘類圖書中,理論上同一個字的字形是不一樣,這些字形每個都需要專門造個字出來。又比如像金甲文字,已經有隸定字的還好些,可以直接換字模,但更多的是沒隸定的,而因為它們不是“方塊字”,拿正常組字方法又沒法組出來,那就只能做成圖字了。
劉慶偉剛入行時,因為沒有任何已有補字成果的積累,幾乎每排一本圖書,就得自己完全從零開始新補幾千個字,做得頭都大了。而且直到現在,古籍出版社為每個需補字支付的報酬,也是很難覆蓋新造一個字的成本的。出版機構為排版公司支付報酬的模式一般是以頁為基準,其余剩下的補字是按個支付。為了能夠重復利用已有成果,他們自己專門做了一個字庫,這樣積累的補字多了,以后才可能可以抹平補字的“損失”乃至獲取利潤。其實還有一類更麻煩的類型是關于俗字圖書的補字。比如張涌泉的《漢語俗字叢考》,這本書里處處都是需要補字的俗字,更關鍵的是這些新造字在其余的書里幾乎無法重復利用,這本書也成為了劉慶偉職業生涯里最令自己頭疼的工作項目之一。
從“趙孟頫”的簡化字爭議到古籍排版中的補字難題,這些技術障礙共同揭示了表意文字體系與數字編碼規則間的深層沖突——漢字的開放性、編碼的統一性、技術的便捷性,如同一個不可能三角,至今仍在等待更優的解決方案。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.