※ 來(lái)源:·BBS 水木清華站 smth.org·[FROM: 162.105.10.32]
代碼頁(yè)(Code Page)初識(shí)
本節(jié)是根據(jù)以下文章編寫(xiě)出來(lái)的,建議認(rèn)真研讀這些專(zhuān)家的高論。
參考1 張 軸 材<<計(jì)算機(jī)世界>>周報(bào) 97-1-17
參考2 <<張軸材 談漢字交換碼標(biāo)準(zhǔn)建立歷程>> <<計(jì)算機(jī)世界>>周報(bào)記者 黃偉敏 肖春江 99-8-30
參考3 <<中文平臺(tái)把住“根”留住>> 吳健 <<中國(guó)計(jì)算機(jī)報(bào)>>出版日期:1998-12-21 總期號(hào):348 本年期號(hào):51
參考4 <<為種種UNIX中文平臺(tái)號(hào)脈>> 孫玉芳 <<中國(guó)計(jì)算機(jī)用戶(hù)>>出版日期:1998-07-06 總期號(hào):323 本年期號(hào):26
參考5 CJK.INF:ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf
因?yàn)楸救酥皇菢I(yè)余水平,不是專(zhuān)家,對(duì)于參考資料中許多術(shù)語(yǔ)還不理解,更沒(méi)有見(jiàn)過(guò)任何一種標(biāo)準(zhǔn)的正式文本,錯(cuò)誤和模糊之處再所難免。同時(shí),因?yàn)閲?guó)家有關(guān)部門(mén)對(duì)于宣傳,推廣和貫徹國(guó)家標(biāo)準(zhǔn)方面力度不夠,致使象我這樣的初學(xué)者或初涉該領(lǐng)域的小企業(yè)因信息資源不足而處于不利的競(jìng)爭(zhēng)地位。
ASCII制訂的時(shí)候,并沒(méi)有考慮對(duì)多語(yǔ)種,特別是對(duì)象中國(guó)漢字這樣的象形文字的支持。為此后來(lái)又提出了不少解決方案,其中代碼頁(yè)體系(ISO2022)是現(xiàn)在普遍實(shí)行的方案,而ISO106/GB13000/Unicode是今后發(fā)展的方向。
中國(guó)的漢字編碼標(biāo)準(zhǔn)GB2312是7bits標(biāo)準(zhǔn),具體說(shuō)是雙7位字節(jié)標(biāo)準(zhǔn)。而ASCII是單7位字節(jié)標(biāo)準(zhǔn),計(jì)算機(jī)怎么區(qū)分呢?一種是在第八位置"1",提示計(jì)算機(jī)轉(zhuǎn)入雙字節(jié)編碼,這是最常見(jiàn)的一種實(shí)現(xiàn),也叫EUC(Extended Unix Code)編碼.另一種是用特殊標(biāo)記提示計(jì)算機(jī)轉(zhuǎn)入雙字節(jié)編碼,如HZ編碼就是用開(kāi)始,用結(jié)束的塊標(biāo)識(shí)雙字節(jié)編碼區(qū).它們都是GB2312的一種實(shí)現(xiàn).對(duì)象中國(guó)漢字這樣的象形文字體系,代碼頁(yè)是根據(jù)各個(gè)國(guó)家,地區(qū)或行業(yè)標(biāo)準(zhǔn),按照EUC方式編碼。代碼頁(yè)向下兼容ASCII,是一種不等長(zhǎng)編碼。會(huì)帶來(lái)代碼的復(fù)雜性,同時(shí)還會(huì)引起因代碼頁(yè)切換而帶來(lái)的亂碼問(wèn)題。
Unicode是一種多字節(jié)等長(zhǎng)編碼。ISO106/GB13000/Unicode現(xiàn)已在UCS2上實(shí)現(xiàn)一致,也就是已實(shí)現(xiàn)雙字節(jié)編碼標(biāo)準(zhǔn)。下面所討論的ISO106/GB13000/Unicode,就只是指UCS2這種情況。Unicode對(duì)ASCII采取前面加"0"字節(jié)的策略實(shí)現(xiàn)等長(zhǎng)兼容。如"A"的ASCII碼為0x41,Unicode碼就為0x00,0x41。
這里主要從國(guó)家標(biāo)準(zhǔn)(GB)系列入手了解Unicode。如果不是看了參考5(英文),我還不知道國(guó)家關(guān)于漢字編碼的標(biāo)準(zhǔn)如此之多。中國(guó)人居然要從英文資料里了解漢字編碼標(biāo)準(zhǔn),實(shí)在是很無(wú)奈的事情。
常用中文編碼標(biāo)準(zhǔn) 資料來(lái)源:CJK.INF
GB2312-1980(GB0)(簡(jiǎn)體) GB7589-1987(GB2)(簡(jiǎn)體)
GB7590-1987(GB4)(簡(jiǎn)體) GB13000-1993
GB6345.1-1986(GB0修正)
GB8565.2-1988(GB8,GB0擴(kuò)充)
GB/T12345-90(GB1)(繁體) GB/T13131-9X(GB3)(繁體)
GB/T13132-9X(GB5)(繁體)
其中橫向表示字符集系列。縱向表示各個(gè)系列的發(fā)展標(biāo)準(zhǔn)。其中GB2312是基本集,也就是目前最常用的標(biāo)準(zhǔn)。GB7589/GB7590是擴(kuò)展集,使用時(shí)可能不能和GB2312共存,需要切換使用。GB7589/GB7590是按部件(部首)和筆順(筆畫(huà))排列,但具體有什么字,怎么排列,用在什么領(lǐng)域,不清楚。GB2312系列經(jīng)過(guò)兩次修正和擴(kuò)充,已和原始的GB2312-1980標(biāo)準(zhǔn)有些不同(參考5)。因?yàn)闆](méi)有標(biāo)準(zhǔn)文本,不知道正在使用的字體是屬于哪個(gè)標(biāo)準(zhǔn)。根據(jù)最新的Unicode3.0,國(guó)家標(biāo)準(zhǔn)最新的是GB16500-95 ,更不知是哪個(gè)系列的了。ISO/IEC 106等同于GB13000-1993/JIS0221-1995/KSC5000-1995這些國(guó)家標(biāo)準(zhǔn)。制訂的目標(biāo)是包容各語(yǔ)種的文字,其中以漢字最多(Unicode2.0有20902個(gè)漢字)。關(guān)于標(biāo)準(zhǔn)的特點(diǎn)可以看參考1,制訂過(guò)程中的風(fēng)風(fēng)雨雨,可以看參考2。總之,這是一個(gè)我們國(guó)家參與并占主導(dǎo)地位的國(guó)際標(biāo)準(zhǔn)。
GBK是GB2312向GB13000過(guò)渡的一個(gè)中間產(chǎn)物。它是GB2312的一次大的擴(kuò)展,編碼向下兼容GB2312的EUC編碼,字匯(字符集)和GB13000相同,是GB2312的3倍。所以說(shuō)GBK也包含BIG5,Shift-JIS,KSC的字匯。注意只是包含字匯,而編碼與原始的標(biāo)準(zhǔn)是不同的。在具體應(yīng)用中,用GBK字體就可以同時(shí)顯示GB2312,BIG5,Shift-JIS,KSC的字符串。但除了GB2312字符串,其它都要轉(zhuǎn)換(convert)。
因?yàn)檎Z(yǔ)焉不詳,不清楚制訂GBK時(shí)是誰(shuí)占主導(dǎo)地位。因?yàn)橛行┯⑽馁Y料說(shuō)是Microsoft制訂了GBK,而國(guó)家方面也沒(méi)有進(jìn)行說(shuō)明。目前從這些參考資料只知道,94年ISO/IEC 106發(fā)布后,Microsoft開(kāi)發(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(實(shí)際只用到0xF7),第二字節(jié)0xA1~0xFE。GBK對(duì)此進(jìn)行擴(kuò)展。第一字節(jié)為0x81~0xFE,第二字節(jié)分兩部分,一是0x40~0x7E,二是0x80~0xFE。其中和GB2312相同的區(qū)域,字完全相同。擴(kuò)展部分大概是按部件(部首)和筆順(筆畫(huà))從GB13000中取出再排列入GBK中。因此GBK并不是GB13000,雖然兩者字匯相同,但編碼體系不同。一個(gè)是ISO2022系列不等長(zhǎng)編碼,一個(gè)是等長(zhǎng)編碼,并且編碼區(qū)域也不同。注意到GBK實(shí)際上不是國(guó)家標(biāo)準(zhǔn)。在此之前有一個(gè)GB2312基本集,在它之上是一個(gè)技術(shù)更先進(jìn)的GB13000。GBK只是一種過(guò)渡和擴(kuò)展規(guī)范。所以在Unicode里有GB2312->Unicode,GB12345->Unicode的轉(zhuǎn)換表格,而沒(méi)有GBK->Unicode轉(zhuǎn)換表格。只有Microsoft制作的Code Page 936(CP936.TXT)可以算作GBK->Unicode轉(zhuǎn)換表格。但要注意這是一個(gè)商業(yè)公司制作的文件,而不是國(guó)家或國(guó)際標(biāo)準(zhǔn)組織制作的,有可能與標(biāo)準(zhǔn)有不一致的地方。最近在方正字體網(wǎng)站發(fā)現(xiàn)一些有用的標(biāo)準(zhǔn)文件,有興趣可以下載看看.但要注意Gbk-big5.tab和Gb-big5.tab這兩個(gè)文件有點(diǎn)瑕疵.
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)換表,會(huì)和傳統(tǒng)的轉(zhuǎn)換表有所不同。如用GBK<=>Unicode<=>BIG5制作GBK<=>BIG5轉(zhuǎn)換表,就會(huì)和傳統(tǒng)的GB<=>BIG5轉(zhuǎn)換表有所不同。主要是漢字有簡(jiǎn)體和繁體。前者是GBK(中的繁體字)<=>BIG5(繁體字),后者是GB(簡(jiǎn)體)<=>BIG5(繁體)。還有就是對(duì)一些制表符選用不同。對(duì)漢字繁簡(jiǎn)轉(zhuǎn)換有興趣的讀者,可以看
http://www.basistech.com/articles/c2c.html
http://www.cjk.org
//**********************************
內(nèi)碼與字體的關(guān)系
雖然沒(méi)有標(biāo)準(zhǔn)文本,但還是可以大致了解常用標(biāo)準(zhǔn)有那些字。TLC4.0的字庫(kù)帶有GB2312,GB12345,BIG5,GBK標(biāo)準(zhǔn)的pcf字體??梢杂脁fd實(shí)用程序查看。在http://www.debian.org/chinese下有一個(gè)16點(diǎn)陣的Unicode的pcf字體。如果安裝了FreeType,可以使用xmbdfed軟件查看TTF字體。如果用MS WORD,可能會(huì)更簡(jiǎn)單些。
在日常使用中,我們實(shí)際上熟悉的是字碼(內(nèi)碼).在中文WIN9X下,我們輸入一個(gè)雙八位字節(jié),就得到一個(gè)漢字,就會(huì)認(rèn)為這雙八位字節(jié)就是對(duì)應(yīng)這樣的字形.這是錯(cuò)誤的.其實(shí)內(nèi)碼對(duì)于字庫(kù)來(lái)說(shuō),只是查找字形的索引.如果換另一個(gè)編碼標(biāo)準(zhǔn)的字體,同一個(gè)字符串就會(huì)呈現(xiàn)不同的字形,也就是亂碼。我見(jiàn)過(guò)GB2312,BIG5和ISO106/GB13000的TTF字庫(kù).對(duì)于操作系統(tǒng)和應(yīng)用程序來(lái)說(shuō),最喜歡的自然是ISO106/GB13000的TTF字庫(kù)了.因?yàn)檫@時(shí)只需提供一套代碼和一套字庫(kù),修改外部配置文件,就可以用在不同的語(yǔ)種環(huán)境.這就是國(guó)際化和本地化.其中有個(gè)技巧就是ISO106/GB13000的TTF字庫(kù)可以在使用時(shí)可以通過(guò)重映射變成其它標(biāo)準(zhǔn)的字庫(kù).這時(shí)需要的是GBK->Unicode,Big5->Unicode這些轉(zhuǎn)換表.一個(gè)系統(tǒng)要升級(jí)支持Unicode3.0,也難也不難.簡(jiǎn)單的地方是只需修改轉(zhuǎn)換表就行了(如\windows\nls*.*).難的是要升級(jí)字庫(kù).開(kāi)發(fā)字庫(kù)是很困難的,可以到方正字庫(kù)網(wǎng)站看看開(kāi)發(fā)字庫(kù)的步驟.WIN9X使用的是北京中易公司的TTF字庫(kù),MS是不可能開(kāi)發(fā)一套中文字庫(kù)的.我所見(jiàn)過(guò)的ISO106/GB13000的TTF字庫(kù),最新的是99年版,Unicode2.1,方正字庫(kù).要想見(jiàn)到Unicode3.0的所有字形,也只有等這些專(zhuān)業(yè)字庫(kù)開(kāi)發(fā)商做出來(lái)才行.如果現(xiàn)在就想看,只有問(wèn)張軸材了.因?yàn)槊客ㄟ^(guò)一次新標(biāo)準(zhǔn),中國(guó)方面就要提供所有漢字的48x48高精密字形.使用TTF字體始終是誘人的話(huà)題。但現(xiàn)在了解不多,只能簡(jiǎn)單談?wù)剰腡TF字體生成bdf/pcf字體的問(wèn)題。因?yàn)楝F(xiàn)在中文pcf字體很少,只有宋體,仿宋,黑體,楷體四種。要想有更多的字體,有個(gè)取巧的方法就是使用freetype庫(kù)。用ttftobdf程序生成bdf字體,再用bdftopcf程序生成pcf字體。但這種方法生成的字體縮放后比較難看,而且不宜控制。這可能是ttf->bdf的轉(zhuǎn)換過(guò)程丟失了信息,高寬比也和標(biāo)準(zhǔn)的不一樣。機(jī)器生成的東西就是機(jī)械,是不能和手繪的字體相比的。同時(shí),因?yàn)門(mén)TF技術(shù)已成熟,所以也沒(méi)有必要繼續(xù)開(kāi)發(fā)更多的pcf字體。X window將接受和大量使用TTF字體。而pcf字體今后主要用在標(biāo)準(zhǔn)字型(如宋體),小點(diǎn)陣,網(wǎng)上快速下載傳輸方面。只有實(shí)際在X Window下用過(guò)Unicode和TTF的字體,才會(huì)體會(huì)到使用Unicode和TTF,既是一種能力,也是一種負(fù)擔(dān)。因?yàn)椴徽撌鞘裁锤袷降淖煮w文件,最后在使用時(shí)都轉(zhuǎn)化為內(nèi)存里固定點(diǎn)陣字體。如果是16x16點(diǎn)陣,一個(gè)漢字就用32字節(jié)。Unicode3.0有27786個(gè)漢字,至少需要868kb的內(nèi)存。如果要中文英文美觀一致,還得裝載大量的中文字體,所需內(nèi)存可想而知。如果再使用TTF,還需要另一塊內(nèi)存來(lái)運(yùn)算和存儲(chǔ)。因此,就算X Window提供了字體cache和deferglyphs,還是于事無(wú)補(bǔ)。而我們常用的漢字其實(shí)很少。根據(jù)統(tǒng)計(jì),常用漢字的頻率,前165個(gè)漢字頻率和>50%,前1000個(gè)漢字頻率和>95%;按小學(xué)教學(xué)經(jīng)驗(yàn),識(shí)字900個(gè)左右,基本可以讀書(shū),看報(bào),寫(xiě)作文;按小學(xué)教學(xué)大綱,小學(xué)畢業(yè)識(shí)字2500字;GB2312的一級(jí)字庫(kù)的頻率和已>99%。我想我自己識(shí)字大約為4000~5000,對(duì)比Unicode的漢字,好象一個(gè)文盲:-)。因此是用GB2312,還是用GB13000,真是一個(gè)兩難決擇,我們也要為我們的選擇付出代價(jià)。最后通過(guò)內(nèi)碼與字體的關(guān)系,討論UTF8的作用。
UTF8是現(xiàn)有ASCII系統(tǒng)轉(zhuǎn)向Unicode系統(tǒng)的一個(gè)過(guò)渡解決方案。UTF8是保證ASCII兼容性,再向大字符集方向擴(kuò)展。這是Unicode推薦的方案。但是因?yàn)榻鉀Q問(wèn)題的角度不同,對(duì)現(xiàn)有的中文系統(tǒng)不是好的解決方案。
CJK字符編碼標(biāo)準(zhǔn)目前都為一字/兩字節(jié)。中文在UCS2中的編碼范圍是U+4E00~U+9FFFF。按照UTF8的編碼規(guī)則,為一字/三字節(jié),增加1/3的空間。同時(shí)和現(xiàn)有的CJK系統(tǒng)不兼容。CJK系統(tǒng)要使用UTF8,先轉(zhuǎn)換為UCS2,再轉(zhuǎn)換為UTF8。后一步簡(jiǎn)直是多此一舉。因?yàn)閺淖謳?kù)的角度看,字的編碼只是字形在字庫(kù)中的索引。UTF8是變長(zhǎng)碼,不能直接做索引,需要轉(zhuǎn)換為UCS2才能使用字庫(kù)。
隨著GUI的發(fā)展,字庫(kù)逐漸轉(zhuǎn)向TTF。TTF字庫(kù)的編碼標(biāo)準(zhǔn),有GB2312/GB2312的EUC標(biāo)準(zhǔn);BIG5標(biāo)準(zhǔn);ISO106標(biāo)準(zhǔn)。沒(méi)有見(jiàn)過(guò)UTF8的TTF,也不知道CJK這些國(guó)家有哪些系統(tǒng)使用了UTF8編碼。
目前Unicodde有一個(gè)特點(diǎn)就是內(nèi)核代碼(CoreCode)。用戶(hù)表面上可以繼續(xù)使用原有的編碼標(biāo)準(zhǔn),系統(tǒng)內(nèi)部使用UCS2進(jìn)行運(yùn)算和操作。系統(tǒng)使用用戶(hù)可改變的標(biāo)志或模塊,以識(shí)別用戶(hù)需要的編碼標(biāo)準(zhǔn),然后進(jìn)行轉(zhuǎn)換。這樣,系統(tǒng)只需提供一套ISO106的TTF,不修改內(nèi)部代碼,就可以為多個(gè)用戶(hù)同時(shí)提供中文,日文,韓文的支持。Windows95及后面的中文版就是采用這個(gè)方案?,F(xiàn)有的X window的TTF服務(wù)器,X-TT和xfsft也可以使用這個(gè)方案。
前者在TurboLinux中文版里得到了實(shí)現(xiàn),后者我試驗(yàn)過(guò),效果還不錯(cuò)。還有一個(gè)有趣的現(xiàn)象,就是紅旗Linux1.1版所帶的那個(gè)12點(diǎn)陣的pcf字體/usr/X11R6/lib/X11/fonts/misc/gb12st.pcf.gz。這已不是嚴(yán)格意義上的GB2312編碼的字庫(kù)了。用xfd實(shí)用程序查看,好象是從Unicode編碼的TTF字體轉(zhuǎn)換來(lái)的,有些GBK的字,可惜太少。如果他們能出些GBK編碼標(biāo)準(zhǔn)的pcf字體就好了。
CJK系統(tǒng)轉(zhuǎn)向UCS2與ASCII系統(tǒng)轉(zhuǎn)向UTF8,兩者的代碼修改量是相當(dāng)?shù)摹V皇乔罢叨嗔宿D(zhuǎn)換表,需要內(nèi)存多些。不過(guò)ASCII系統(tǒng)使用UCS2,需要增加50%的空間。目前計(jì)算機(jī)里大多數(shù)還是ASCII的信息,看來(lái)這也是一個(gè)問(wèn)題。
//*************************************
內(nèi)碼轉(zhuǎn)換表的來(lái)源與制作
由于歷史和地域的原因,電腦里的中文標(biāo)準(zhǔn)有不少種共存于Internet中。這是現(xiàn)實(shí)。因此出現(xiàn)了內(nèi)碼轉(zhuǎn)換。這方面的程序現(xiàn)在有不少。不過(guò)大多是MS Windows的版本,并且有的毛病不少,所以有必要制作一個(gè)完整些的內(nèi)碼轉(zhuǎn)換表。
資料來(lái)源
自從Unicode/ISO106/GB13000標(biāo)準(zhǔn)出現(xiàn)后,這項(xiàng)工作變得簡(jiǎn)單和繁瑣。因此制作轉(zhuǎn)換表時(shí)有一個(gè)準(zhǔn)則:以國(guó)際和國(guó)家標(biāo)準(zhǔn)為基準(zhǔn),參考有影響的商業(yè)公司的轉(zhuǎn)換表,個(gè)人和小軟件次之。下面是資料的來(lái)源:
一)國(guó)際和國(guó)家標(biāo)準(zhǔn)組織國(guó)際標(biāo)準(zhǔn)組織Unicode(http://www.unicode.org)提供了
GB<=>Unicode轉(zhuǎn)換表:
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/GB
BIG5<=>Unicode轉(zhuǎn)換表:
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/OTHER
JIS<=>Unicode轉(zhuǎn)換表:
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS
KSC<=>Unicode轉(zhuǎn)換表:
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/KSC
因?yàn)镚BK不是國(guó)家標(biāo)準(zhǔn),所以Unicode并沒(méi)有提供GBK<=>Unicode的轉(zhuǎn)換表,而只是采用了Microsoft的code page的一個(gè)版本:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP{936,950}.TXT
中國(guó)國(guó)家標(biāo)準(zhǔn)網(wǎng)入門(mén)太難,須8000元/個(gè)人。因此沒(méi)有得到正式的GB2312-1980和GB13000-1993的標(biāo)準(zhǔn)。
二)商業(yè)公司
2.1 方正集團(tuán)字體部
http://www.founderpku.com/fontweb/
因?yàn)榉秸钱a(chǎn),學(xué),研的綜合體,在排版和字體領(lǐng)域奮斗多年,有很特殊的地位。他們提供的轉(zhuǎn)換表,幾乎可以等同國(guó)家標(biāo)準(zhǔn)。
GB2312標(biāo)準(zhǔn):
http://www.founderpku.com/fontweb/gb2312.htm
GBK標(biāo)準(zhǔn):
http://www.founderpku.com/fontweb/gbk.htm
GB<=>BIG5轉(zhuǎn)換表:
http://www.founderpku.com/fontweb/download/Gb-big5.tab
GBK<=>BIG5轉(zhuǎn)換表:
http://www.founderpku.com/fontweb/download/Gbk-big5.tab
2.2 Microsoft
http://www.microsoft.com/
Microsoft是誰(shuí)也忽略不了的。有時(shí)候就算是他們錯(cuò)了,最后也是對(duì)的。在有些英文資料里把GBK說(shuō)成是Microsoft制訂的。Microsoft從商業(yè)角度出發(fā),提供的是code pages:
GBK字形表:
http://www.microsoft.com/typography/unicode/936gif.zip
GBK<=>Unicode轉(zhuǎn)換表:
http://www.microsoft.com/typography/unicode/936.txt
BIG5字形表:
http://www.microsoft.com/typography/unicode/950gif.zip
BIG5<=>Unicode轉(zhuǎn)換表:
http://www.microsoft.com/typography/unicode/950.txt
在Windows97/98中文版里也提供了些資料:
GBK標(biāo)準(zhǔn):\windows\GBK.txt
code pages:\windows\system\cp{932,936,949,950}.nls
三)個(gè)人與共享軟件
有不少個(gè)人和小團(tuán)體也在這方面進(jìn)行了探索。
3.1 TextPro http://person.zj.cninfo.net/~buddha
因?yàn)樗麄兲厥獾男枨螅琓extPro確實(shí)在BIG5=>GBK/GB轉(zhuǎn)換方面有獨(dú)到之處。同時(shí)還有個(gè)GBK(繁體)=>GB(簡(jiǎn)體)轉(zhuǎn)換表,很有特色。因?yàn)榉斌w=>簡(jiǎn)體是多對(duì)一的映射,因此很難有簡(jiǎn)體=>繁體的轉(zhuǎn)換表。特別是基于字到字的映射的轉(zhuǎn)換是不可能的。目前已有人進(jìn)行基于詞典和上下文的詞到詞的映射。有興趣可以看
http://www.basistech.com/articles/c2c.html
3.2 Stone Chi http://stonec.yeah.net
提供了基于RichWin的內(nèi)碼轉(zhuǎn)換表。收集了不少的資料,對(duì)內(nèi)碼標(biāo)準(zhǔn)有較深的了解。同時(shí)還有一個(gè)中文檢索軟件值得一嘗。
3.3 NJStar http://www.njstar.com 和MagicWin http://www.magicwin.com.my
他們?cè)谶@領(lǐng)域有些日子了。不過(guò)轉(zhuǎn)換表不是很全。
制作
根據(jù)上面的準(zhǔn)則和排列次序制作。如果上一級(jí)有空白,就要下一級(jí)填補(bǔ);如果有沖突,就以上一級(jí)的為準(zhǔn)。
一)根據(jù)Unicode的GB<=>Unicode與BIG5<=>Unicode轉(zhuǎn)換表制作GB<=>BIG5轉(zhuǎn)換表。
二)根據(jù)Microsoft的GBK<=>Unicode與BIG5<=>Unicode轉(zhuǎn)換表制作GBK<=>BIG5轉(zhuǎn)換表。
至此,基于標(biāo)準(zhǔn)的轉(zhuǎn)換實(shí)際已經(jīng)完成。Unicode的特點(diǎn)就是一字一碼,一碼一字。各個(gè)國(guó)家和地區(qū)的漢字標(biāo)準(zhǔn)已編入U(xiǎn)nicode的,并有相同的Unicode碼的漢字,就是叫CJK認(rèn)同漢字。但有些漢字因?yàn)榉N種原因而未能得到認(rèn)同,如果制作這些漢字的轉(zhuǎn)換表,只能是基于實(shí)用的,有可能多對(duì)多映射的轉(zhuǎn)換表。
三)使用方正的GBK<=>BIG5轉(zhuǎn)換表填充(一)的GB<=>BIG5轉(zhuǎn)換表。
四)使用Microsoft的GBK<=>BIG5轉(zhuǎn)換表填充(三)的GBK<=>BIG5轉(zhuǎn)換表。
五)使用TextPro和stonec的GBK<=>BIG5轉(zhuǎn)換表填充(四)的GBK<=>BIG5轉(zhuǎn)換表。
六)NJStar的轉(zhuǎn)換表雖然不是很全,但在BIG5=>GBK轉(zhuǎn)換表中的C6行后半段和C7,C8行卻相當(dāng)完整。上面的轉(zhuǎn)換表在這里不是空白就是很少轉(zhuǎn)換。可能這個(gè)區(qū)域是屬于擴(kuò)充符號(hào)區(qū),可有可無(wú)。為保險(xiǎn)起見(jiàn),使用NJStar填充這個(gè)區(qū)域。
七)校驗(yàn)。通過(guò)電腦對(duì)碼表進(jìn)行校驗(yàn),發(fā)現(xiàn)在漢字編碼方面基本一致。有沖突的地方基本上是對(duì)制表符的理解不同造成的。
八)目測(cè)校驗(yàn)。也就是用肉眼一個(gè)字一個(gè)字的檢查。這是最重要的一步。但因?yàn)閷W(xué)識(shí)和精力有限,未能做到這一步。
//***************************************
漢字編碼識(shí)別
因?yàn)闅v史和地域原因,漢字有不少編碼標(biāo)準(zhǔn)。最常見(jiàn)的是GB2312和BIG5。在Unicode被完全接受前,他們將共存相當(dāng)長(zhǎng)的一段時(shí)間。因此在實(shí)際應(yīng)用中有必要把它們區(qū)分顯示。這就是編碼識(shí)別。
現(xiàn)在在Windows平臺(tái)下有不少軟件可以識(shí)別和同屏顯示GB2312和BIG5字符串,已相當(dāng)準(zhǔn)確。但因?yàn)槠渲刑N(yùn)藏著不小的商機(jī),這些算法都不公開(kāi)。現(xiàn)在只見(jiàn)兩種算法:
1)算法1 http://www.mandarintools.com
2)算法2 http://202.38.128.58/~yumj/www/chrecog.html
具體的原理可以看發(fā)明人的主頁(yè)。因?yàn)檫@兩種算法是通過(guò)大量的文章統(tǒng)計(jì)出來(lái)的,而實(shí)際應(yīng)用是一行行的識(shí)別。所以有必要對(duì)短句和詞組的有效性進(jìn)行驗(yàn)證。這里用了一個(gè)取巧的方法,分析對(duì)常用詞組的識(shí)別率。因?yàn)榫渥哟蠖嘤蛇@些有意義的詞組組成。因?yàn)閮砂恫坏幋a不同,習(xí)慣用語(yǔ)也不同。所以分別收集了GB詞組1.3MB,BIG5詞組900KB。通過(guò)對(duì)比發(fā)現(xiàn)一些有趣的事情。
1)算法1占用內(nèi)存大些,速度慢些,但識(shí)別率高些,并且穩(wěn)定.誤差為8.6%,算法2正好相反,誤差為17.6%。綜合兩者可以提高一些識(shí)別率。
兩種算法的識(shí)別率
算法1 算法2 綜合
GB文件 5% 2.6% 0.7%
BIG5文件 3.6% 15% 5%
2)算法2提到的平均值184的閾值確實(shí)存在。但最好的算法不是作者所說(shuō)的第二字節(jié)算法。而是第一字節(jié)和第二字節(jié)相加的算法。用三種算法分析GB詞組,都呈正態(tài)分布:第一字節(jié)算法峰值在195,坡度陡峭,說(shuō)明平均值集中。第二字節(jié)算法峰值在207,坡度平緩,說(shuō)明平均值分散。雙字節(jié)相加算法介于兩者之間。
分析BIG5詞組:
第一字節(jié)算法有峰值174,但坡度平緩得多。
第二字節(jié)算法有峰值160左右,更平緩,呈矩形分布,也就是BIG5常用詞組的第二字節(jié)的編碼范圍分布比較均勻。
雙字節(jié)相加算法是兩者的迭加。
所以較好的算法是:
flag = (a * c1 + c2) / (a + 1) (a = 5 ~ 7為佳)
以184為界,GB詞組有5%的詞的平均值小于184,BIG5詞組有15%的詞的平均值大于184,綜合誤差為17.6%。也就是說(shuō),對(duì)于GB碼的字符串,算法2不易錯(cuò)判,對(duì)于BIG5碼的字符串則相反。如果是GB文件轉(zhuǎn)換為BIG5碼,誤差要低些,為15%,好象是GB碼的編碼和用字比較集中些.
3)算法1識(shí)別率提高的可能
GB2312標(biāo)準(zhǔn)的漢字有6763個(gè),BIG5還要多些。而算法1只取600個(gè)字進(jìn)行加權(quán),似乎少了些。加權(quán)系數(shù)從1~600規(guī)則排列,似乎不能反映字頻變化的規(guī)律。對(duì)于GB2312,按常用的2:8的規(guī)律,應(yīng)選1200字左右;按小學(xué)教學(xué)大綱,小學(xué)畢業(yè)識(shí)字2500字;按小學(xué)教學(xué)經(jīng)驗(yàn),識(shí)字900個(gè)左右,基本可以讀書(shū),看報(bào),寫(xiě)作文。因此,這加權(quán)范圍應(yīng)該在900~1000字左右。但選哪些字,字頻多少,應(yīng)該是我們的語(yǔ)言文字專(zhuān)家發(fā)言的時(shí)候了。
4)新的可能算法
兩岸漢字編碼不同,常用語(yǔ)也不同,那么常用詞組也不同。因此從常用詞組分析差別更大,識(shí)別率也就更高??上](méi)有資料,因此現(xiàn)在只有設(shè)想,沒(méi)有算法。同時(shí)希望更多的人本著GPL大集市的精神,提供更多更好的算法。
- 作者: easthero 2005年08月22日, 星期一 19:25
聯(lián)系客服