空空也

          IT技術(shù)交流平臺

          常用鏈接

          統(tǒng)計

          最新評論

          漢字編碼標(biāo)準(zhǔn)與識別(一)

          代碼頁(Code Page)初識 本節(jié)是根據(jù)以下文章編寫出來的,建議認(rèn)真研讀這些專家的高論。 參考1 <> 張 軸 材 <<計算機(jī)世界>>周報 97-1-17 參考2 <<張軸材 談漢字交換碼標(biāo)準(zhǔn)建立歷程>> <<計算機(jī)世界>>周 報記者 黃偉敏 肖春江 99-8-30 參考3 <<中文平臺把住“根”留住>> 吳健 <<中國計算機(jī)報>> 出版日期:1998-12-21 總期號:348 本年期號:51 參考4 <<為種種UNIX中文平臺號脈>> 孫玉芳 <<中國計算機(jī)用戶>> 出版日期:1998-07-06 總期號:323 本年期號:26 參考5 CJK.INF:ftp://ftp.ora.com/pub/examples/nutshell/ujip/ doc/cjk.inf 因為本人只是業(yè)余水平,不是專家,對于參考資料中許多術(shù)語還不 理解,更沒有見過任何一種標(biāo)準(zhǔn)的正式文本,錯誤和模糊之處再所 難免。同時,因為國家有關(guān)部門對于宣傳,推廣和貫徹國家標(biāo)準(zhǔn)方 面力度不夠,致使象我這樣的初學(xué)者或初涉該領(lǐng)域的小企業(yè)因信息 資源不足而處于不利的競爭地位。 ASCII制訂的時候,并沒有考慮對多語種,特別是對象中國漢字這樣 的象形文字的支持。為此后來又提出了不少解決方案,其中代碼頁 體系(ISO2022)是現(xiàn)在普遍實行的方案,而ISO10646/GB13000/Unicode 是今后發(fā)展的方向。 中國的漢字編碼標(biāo)準(zhǔn)GB2312是7bits標(biāo)準(zhǔn),具體說是雙7位字節(jié)標(biāo)準(zhǔn)。 而ASCII是單7位字節(jié)標(biāo)準(zhǔn),計算機(jī)怎么區(qū)分呢?一種是在第八位置"1", 提示計算機(jī)轉(zhuǎn)入雙字節(jié)編碼,這是最常見的一種實現(xiàn),也叫EUC (Extended Unix Code)編碼.另一種是用特殊標(biāo)記提示計算機(jī)轉(zhuǎn)入雙 字節(jié)編碼,如HZ編碼就是用開始,用結(jié)束的塊標(biāo)識雙字節(jié)編碼區(qū).它們 都是GB2312的一種實現(xiàn).對象中國漢字這樣的象形文字體系,代碼頁 是根據(jù)各個國家,地區(qū)或行業(yè)標(biāo)準(zhǔn),按照EUC方式編碼。代碼頁向下 兼容ASCII,是一種不等長編碼。會帶來代碼的復(fù)雜性,同時還會引 起因代碼頁切換而帶來的亂碼問題。 Unicode是一種多字節(jié)等長編碼。ISO10646/GB13000/Unicode現(xiàn)已在 UCS2上實現(xiàn)一致,也就是已實現(xiàn)雙字節(jié)編碼標(biāo)準(zhǔn)。下面所討論的 ISO10646/GB13000/Unicode,就只是指UCS2這種情況。Unicode對 ASCII采取前面加"0"字節(jié)的策略實現(xiàn)等長兼容。如"A"的ASCII碼為0x41, Unicode碼就為0x00,0x41。 這里主要從國家標(biāo)準(zhǔn)(GB)系列入手了解Unicode。如果不是看了參考5 (英文),我還不知道國家關(guān)于漢字編碼的標(biāo)準(zhǔn)如此之多。中國人居然 要從英文資料里了解漢字編碼標(biāo)準(zhǔn),實在是很無奈的事情。 常用中文編碼標(biāo)準(zhǔn) 資料來源:CJK.INF GB2312-1980(GB0)(簡體) GB7589-1987(GB2)(簡體) GB7590-1987(GB4)(簡體) GB13000-1993 GB6345.1-1986(GB0修正) GB8565.2-1988(GB8,GB0擴(kuò)充) GB/T12345-90(GB1)(繁體) GB/T13131-9X(GB3)(繁體) GB/T13132-9X(GB5)(繁體) 其中橫向表示字符集系列。縱向表示各個系列的發(fā)展標(biāo)準(zhǔn)。其中 GB2312是基本集,也就是目前最常用的標(biāo)準(zhǔn)。GB7589/GB7590是擴(kuò)展 集,使用時可能不能和GB2312共存,需要切換使用。GB7589/GB7590 是按部件(部首)和筆順(筆畫)排列,但具體有什么字,怎么排列, 用在什么領(lǐng)域,不清楚。GB2312系列經(jīng)過兩次修正和擴(kuò)充,已和原 始的GB2312-1980標(biāo)準(zhǔn)有些不同(參考5)。因為沒有標(biāo)準(zhǔn)文本,不知 道正在使用的字體是屬于哪個標(biāo)準(zhǔn)。根據(jù)最新的Unicode3.0,國家 標(biāo)準(zhǔn)最新的是GB16500-95 ,更不知是哪個系列的了。ISO/IEC 10646 等同于GB13000-1993/JIS0221-1995/KSC5000-1995這些國家標(biāo)準(zhǔn)。 制訂的目標(biāo)是包容各語種的文字,其中以漢字最多(Unicode2.0有 20902個漢字)。關(guān)于標(biāo)準(zhǔn)的特點可以看參考1,制訂過程中的風(fēng)風(fēng) 雨雨,可以看參考2。總之,這是一個我們國家參與并占主導(dǎo)地位 的國際標(biāo)準(zhǔn)。 GBK是GB2312向GB13000過渡的一個中間產(chǎn)物。它是GB2312的一次大 的擴(kuò)展,編碼向下兼容GB2312的EUC編碼,字匯(字符集)和GB13000 相同,是GB2312的3倍。所以說GBK也包含BIG5,Shift-JIS,KSC的 字匯。注意只是包含字匯,而編碼與原始的標(biāo)準(zhǔn)是不同的。在具體 應(yīng)用中,用GBK字體就可以同時顯示GB2312,BIG5,Shift-JIS,KSC 的字符串。但除了GB2312字符串,其它都要轉(zhuǎn)換(convert)。 因為語焉不詳,不清楚制訂GBK時是誰占主導(dǎo)地位。因為有些英文資 料說是Microsoft制訂了GBK,而國家方面也沒有進(jìn)行說明。目前從 這些參考資料只知道,94年ISO/IEC 10646發(fā)布后,Microsoft開發(fā) Windows95中文版,要制訂中文擴(kuò)展編碼。96年《漢字?jǐn)U展內(nèi)碼規(guī)范》 GBK發(fā)布(參考1~3)。按標(biāo)準(zhǔn)發(fā)布比制定晚一年推算,這是95年的事。 Windows95及后續(xù)版本中文版支持GBK。 GB2312的EUC編碼范圍是第一字節(jié)0xA1~0xFE(實際只用到0xF7),第 二字節(jié)0xA1~0xFE。GBK對此進(jìn)行擴(kuò)展。第一字節(jié)為0x81~0xFE,第二 字節(jié)分兩部分,一是0x40~0x7E,二是0x80~0xFE。其中和GB2312相 同的區(qū)域,字完全相同。擴(kuò)展部分大概是按部件(部首)和筆順(筆畫) 從GB13000中取出再排列入GBK中。因此GBK并不是GB13000,雖然兩者 字匯相同,但編碼體系不同。一個是ISO2022系列不等長編碼,一個 是等長編碼,并且編碼區(qū)域也不同。注意到GBK實際上不是國家標(biāo)準(zhǔn)。 在此之前有一個GB2312基本集,在它之上是一個技術(shù)更先進(jìn)的GB13000。 GBK只是一種過渡和擴(kuò)展規(guī)范。所以在Unicode里有GB2312->Unicode, GB12345->Unicode的轉(zhuǎn)換表格,而沒有GBK->Unicode轉(zhuǎn)換表格。只有 Microsoft制作的Code Page 936(CP936.TXT)可以算作GBK->Unicode 轉(zhuǎn)換表格。但要注意這是一個商業(yè)公司制作的文件,而不是國家或 國際標(biāo)準(zhǔn)組織制作的,有可能與標(biāo)準(zhǔn)有不一致的地方。最近在方正字 體網(wǎng)站發(fā)現(xiàn)一些有用的標(biāo)準(zhǔn)文件,有興趣可以下載看看.但要注意 Gbk-big5.tab和Gb-big5.tab這兩個文件有點瑕疵. http://www.founderpku.com/fontweb/download/Gbk-big5.tab http://www.founderpku.com/fontweb/download/Gb-big5.tab http://www.founderpku.com/fontweb/gb2312.htm http://www.founderpku.com/fontweb/gbk.htm 在使用這些轉(zhuǎn)換表制作其它標(biāo)準(zhǔn)的相互轉(zhuǎn)換表,會和傳統(tǒng)的轉(zhuǎn)換表 有所不同。如用GBK<=>Unicode<=>BIG5制作GBK<=>BIG5轉(zhuǎn)換表,就 會和傳統(tǒng)的GB<=>BIG5轉(zhuǎn)換表有所不同。主要是漢字有簡體和繁體。 前者是GBK(中的繁體字)<=>BIG5(繁體字),后者是GB(簡體)<=>BIG5(繁體)。 還有就是對一些制表符選用不同。對漢字繁簡轉(zhuǎn)換有興趣的讀者,可以看 http://www.basistech.com/articles/c2c.html http://www.cjk.org 內(nèi)碼與字體的關(guān)系 雖然沒有標(biāo)準(zhǔn)文本,但還是可以大致了解常用標(biāo)準(zhǔn)有那些字。TLC4.0的 字庫帶有GB2312,GB12345,BIG5,GBK標(biāo)準(zhǔn)的pcf字體。可以用xfd實用 程序查看。在http://www.debian.org/chinese下有一個16點陣的Unicode 的pcf字體。如果安裝了FreeType,可以使用xmbdfed軟件查看TTF字體。 如果用MS WORD,可能會更簡單些。 在日常使用中,我們實際上熟悉的是字碼(內(nèi)碼).在中文WIN9X下,我們輸 入一個雙八位字節(jié),就得到一個漢字,就會認(rèn)為這雙八位字節(jié)就是對應(yīng)這 樣的字形.這是錯誤的.其實內(nèi)碼對于字庫來說,只是查找字形的索引.如 果換另一個編碼標(biāo)準(zhǔn)的字體,同一個字符串就會呈現(xiàn)不同的字形,也就 是亂碼。我見過GB2312,BIG5和ISO10646/GB13000的TTF字庫.對于操作系 統(tǒng)和應(yīng)用程序來說,最喜歡的自然是ISO10646/GB13000的TTF字庫了.因為 這時只需提供一套代碼和一套字庫,修改外部配置文件,就可以用在不同的 語種環(huán)境.這就是國際化和本地化.其中有個技巧就是ISO10646/GB13000的 TTF字庫可以在使用時可以通過重映射變成其它標(biāo)準(zhǔn)的字庫.這時需要的是 GBK->Unicode,Big5->Unicode這些轉(zhuǎn)換表.一個系統(tǒng)要升級支持Unicode3.0, 也難也不難.簡單的地方是只需修改轉(zhuǎn)換表就行了(如windows ls*.*). 難的是要升級字庫.開發(fā)字庫是很困難的,可以到方正字庫網(wǎng)站看看開發(fā)字 庫的步驟.WIN9X使用的是北京中易公司的TTF字庫,MS是不可能開發(fā)一套中 文字庫的.我所見過的ISO10646/GB13000的TTF字庫,最新的是99年版,Unicode2.1 , 方正字庫.要想見到Unicode3.0的所有字形,也只有等這些專業(yè)字庫開發(fā)商 做出來才行.如果現(xiàn)在就想看,只有問張軸材了.因為每通過一次新標(biāo)準(zhǔn),中 國方面就要提供所有漢字的48x48高精密字形.使用TTF字體始終是誘人的話 題。但現(xiàn)在了解不多,只能簡單談?wù)剰腡TF字體生成bdf/pcf字體的問題。 因為現(xiàn)在中文pcf字體很少,只有宋體,仿宋,黑體,楷體四種。要想有更 多的字體,有個取巧的方法就是使用freetype庫。用ttftobdf程序生成bdf 字體,再用bdftopcf程序生成pcf字體。但這種方法生成的字體縮放后比較 難看,而且不宜控制。這可能是ttf->bdf的轉(zhuǎn)換過程丟失了信息,高寬比 也和標(biāo)準(zhǔn)的不一樣。機(jī)器生成的東西就是機(jī)械,是不能和手繪的字體相比 的。同時,因為TTF技術(shù)已成熟,所以也沒有必要繼續(xù)開發(fā)更多的pcf字體。 X window將接受和大量使用TTF字體。而pcf字體今后主要用在標(biāo)準(zhǔn)字型 (如宋體),小點陣,網(wǎng)上快速下載傳輸方面。只有實際在X Window下用 過Unicode和TTF的字體,才會體會到使用Unicode和TTF,既是一種能力, 也是一種負(fù)擔(dān)。因為不論是什么格式的字體文件,最后在使用時都轉(zhuǎn)化為 內(nèi)存里固定點陣字體。如果是16x16點陣,一個漢字就用32字節(jié)。Unicode3.0 有27786個漢字,至少需要868kb的內(nèi)存。如果要中文英文美觀一致,還得裝 載大量的中文字體,所需內(nèi)存可想而知。如果再使用TTF,還需要另一塊內(nèi) 存來運算和存儲。因此,就算X Window提供了字體cache和deferglyphs, 還是于事無補(bǔ)。而我們常用的漢字其實很少。根據(jù)統(tǒng)計,常用漢字的頻率, 前165個漢字頻率和>50%,前1000個漢字頻率和>95%;按小學(xué)教學(xué)經(jīng)驗,識 字900個左右,基本可以讀書,看報,寫作文;按小學(xué)教學(xué)大綱,小學(xué)畢業(yè) 識字2500字;GB2312的一級字庫的頻率和已>99%。我想我自己識字大約為 4000~5000,對比Unicode的漢字,好象一個文盲:-)。因此是用GB2312,還 是用GB13000,真是一個兩難決擇,我們也要為我們的選擇付出代價。 最后通過內(nèi)碼與字體的關(guān)系,討論UTF8的作用。 UTF8是現(xiàn)有ASCII系統(tǒng)轉(zhuǎn)向Unicode系統(tǒng)的一個過渡解決方案。UTF8是保證 ASCII兼容性,再向大字符集方向擴(kuò)展。這是Unicode推薦的方案。但是因 為解決問題的角度不同,對現(xiàn)有的中文系統(tǒng)不是好的解決方案。 CJK字符編碼標(biāo)準(zhǔn)目前都為一字/兩字節(jié)。中文在UCS2中的編碼范圍是 U+4E00~U+9FFFF。按照UTF8的編碼規(guī)則,為一字/三字節(jié),增加1/3的空間。 同時和現(xiàn)有的CJK系統(tǒng)不兼容。CJK系統(tǒng)要使用UTF8,先轉(zhuǎn)換為UCS2,再轉(zhuǎn)換 為UTF8。后一步簡直是多此一舉。因為從字庫的角度看,字的編碼只是字形 在字庫中的索引。UTF8是變長碼,不能直接做索引,需要轉(zhuǎn)換為UCS2才能使 用字庫。 隨著GUI的發(fā)展,字庫逐漸轉(zhuǎn)向TTF。TTF字庫的編碼標(biāo)準(zhǔn),有GB2312/GB2312 的EUC標(biāo)準(zhǔn);BIG5標(biāo)準(zhǔn);ISO10646標(biāo)準(zhǔn)。沒有見過UTF8的TTF,也不知道CJK 這些國家有哪些系統(tǒng)使用了UTF8編碼。 目前Unicodde有一個特點就是內(nèi)核代碼(CoreCode)。用戶表面上可以繼續(xù)使 用原有的編碼標(biāo)準(zhǔn),系統(tǒng)內(nèi)部使用UCS2進(jìn)行運算和操作。系統(tǒng)使用用戶可改 變的標(biāo)志或模塊,以識別用戶需要的編碼標(biāo)準(zhǔn),然后進(jìn)行轉(zhuǎn)換。這樣,系統(tǒng) 只需提供一套ISO10646的TTF,不修改內(nèi)部代碼,就可以為多個用戶同時提供 中文,日文,韓文的支持。Windows95及后面的中文版就是采用這個方案。現(xiàn) 有的X window的TTF服務(wù)器,X-TT和xfsft也可以使用這個方案。 前者在TurboLinux中文版里得到了實現(xiàn),后者我試驗過,效果還不錯。還有 一個有趣的現(xiàn)象,就是紅旗Linux1.1版所帶的那個12點陣的pcf字體 /usr/X11R6/lib/X11/fonts/misc/gb12st.pcf.gz。這已不是嚴(yán)格意義上的 GB2312編碼的字庫了。用xfd實用程序查看,好象是從Unicode編碼的TTF字體 轉(zhuǎn)換來的,有些GBK的字,可惜太少。如果他們能出些GBK編碼標(biāo)準(zhǔn)的pcf字體 就好了。 CJK系統(tǒng)轉(zhuǎn)向UCS2與ASCII系統(tǒng)轉(zhuǎn)向UTF8,兩者的代碼修改量是相當(dāng)?shù)摹V皇乔? 者多了轉(zhuǎn)換表,需要內(nèi)存多些。不過ASCII系統(tǒng)使用UCS2,需要增加50%的空間。 目前計算機(jī)里大多數(shù)還是ASCII的信息,看來這也是一個問題。

          posted on 2006-04-19 11:54 空空也 閱讀(1829) 評論(2)  編輯  收藏

          評論

          # re: 漢字編碼標(biāo)準(zhǔn)與識別(一) 2007-04-24 19:28 監(jiān)控軟件

          樓主內(nèi)容不錯,就是文檔格式太亂了。建議排版一下。  回復(fù)  更多評論   

          # re: 漢字編碼標(biāo)準(zhǔn)與識別(一) 2007-08-10 09:36 dreamstone

          恩,blog排版很重要,因為有別人要看。呵呵。  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 土默特左旗| 阳信县| 博白县| 阿拉尔市| 四川省| 通江县| 唐海县| 获嘉县| 武胜县| 西畴县| 新源县| 金秀| 花莲市| 托克逊县| 易门县| 怀集县| 桐庐县| 崇信县| 白河县| 宜城市| 彩票| 永顺县| 高平市| 余庆县| 崇明县| 梅州市| 泸水县| 天镇县| 长沙县| 民勤县| 崇明县| 淄博市| 兴文县| 吐鲁番市| 平山县| 调兵山市| 凯里市| 平昌县| 忻城县| 洛川县| 浦县|