胡群英,符浩軍,魏彩虹
測繪信息技術(shù)總站,陜西 西安,710054
?
適于數(shù)字地圖的漢字編碼轉(zhuǎn)換方法
胡群英,符浩軍,魏彩虹
測繪信息技術(shù)總站,陜西 西安,710054
數(shù)字地圖中的文字注記作為地圖語言的組成部分,在彌補(bǔ)地圖符號不足、地圖信息傳輸?shù)确矫嬷匾饔谩;谟嬎銠C(jī)漢字處理的特點,本文以地圖中的常見字和生僻字為研究對象,提出了一種數(shù)字地圖文件中漢字編碼模式的自動分析方法和高效字符編碼轉(zhuǎn)換算法,研制了一種數(shù)字地圖文字編碼轉(zhuǎn)換軟件,從而有效地解決了測繪保障工作中非國標(biāo)中文編碼、生僻字編碼等數(shù)字地圖系統(tǒng)的運(yùn)行顯示問題,并在實際的數(shù)字地圖分析、顯示和應(yīng)用工作中發(fā)揮了重要作用。
數(shù)字地圖;漢字編碼;編碼轉(zhuǎn)換;方法研究
測繪保障工作經(jīng)常需要使用多種數(shù)字地圖作為分析的基本資料,實際應(yīng)用中,由于數(shù)字地圖來源的多樣性,地圖數(shù)據(jù)采用的文字編碼也多種多樣,并且地圖數(shù)據(jù)經(jīng)常存在一定數(shù)量的生僻字和特殊字符,而這類文字由于沒有標(biāo)準(zhǔn)字符編碼,無法通過計算機(jī)系統(tǒng)自身的字庫和輸入法進(jìn)行漢字的輸入和存儲,上述情況使得不少地圖數(shù)據(jù)的文字注記無法正常顯示[1]。為了解決上述問題,本文探討了以文本形式存儲數(shù)字地圖的文字內(nèi)容時,文字不同字符編碼的轉(zhuǎn)換問題。通過分析和識別字符編碼,設(shè)計生僻字編碼,建立漢字編碼對照表,提出了高效的字符編碼轉(zhuǎn)換算法,實現(xiàn)了一套數(shù)字地圖文字編碼轉(zhuǎn)換軟件。該軟件將數(shù)字地圖文件中不同字符編碼的文本文件,轉(zhuǎn)換為操作系統(tǒng)下可以正確運(yùn)行與顯示的地圖數(shù)據(jù)文件。
為了使?jié)h字在計算機(jī)系統(tǒng)中有統(tǒng)一的代碼,我國頒布了漢字編碼國家標(biāo)準(zhǔn)GB2312-80《信息交換用漢字編碼字符集基本集》[2]、GBK《漢字內(nèi)碼擴(kuò)展規(guī)范》[3]、GB18030-2000《信息交換用漢字編碼字符集基本集的擴(kuò)充》等。我國臺灣地區(qū)實行的漢字編碼字符集是BIG5。
2.1 GB2312字符集
GB2312-80是一個簡化字的編碼規(guī)范,由國家標(biāo)準(zhǔn)總局發(fā)布,于1981年5月實施,通行于我國大陸地區(qū)以及新加坡等地。它包括漢字、符號、字母、日文假名等,共7445個圖形字符,其中漢字占6763個。GB2312所收錄的漢字已經(jīng)覆蓋99.75%的使用頻率,基本滿足了漢字的計算機(jī)處理需要。
GB2312-80規(guī)定,對任意一個圖形字符都采用兩個字節(jié)表示,每個字節(jié)均采用八位編碼表示。習(xí)慣上稱第一個字節(jié)為“高字節(jié)”,第二個字節(jié)為“低字節(jié)”,而每個字節(jié)的最高位為“1”。因此,GB2312-80中漢字的編碼范圍為:第一字節(jié)0xB0至0xF7,對應(yīng)十進(jìn)制為176至247;第二個字節(jié)0xA0至0xFE,對應(yīng)十進(jìn)制為160至254。
2.2 BIG5字符集
BIG5編碼是中文繁體字編碼,于1984年由臺灣財團(tuán)法人信息工業(yè)策進(jìn)會和五家軟件公司宏碁(Acer)、神通(MiTAC)、佳佳、零壹(Zero One)、大眾(FIC)創(chuàng)立,故稱大五碼,主要在我國臺灣地區(qū)和香港地區(qū)使用,它包含了420個符號和13070個漢字。
BIG5漢字編碼中,每個漢字由兩個字節(jié)構(gòu)成。第一個字節(jié)的編碼范圍從0x81至0xFE,即十進(jìn)制的129至255,共126種;第二個字節(jié)的編碼范圍由兩段組成,不連續(xù),分別為0x40至0x7E和0xA1至0xFE,即十進(jìn)制的64至126和十進(jìn)制的161至254,共157種。因此,其第一字節(jié)的最高位是1,第二字節(jié)的最高位則可能是1、也可能是0。盡管BIG5碼內(nèi)包含一萬多個字符,但是沒有考慮社會上流通的人名、地名用字、方言用字、化學(xué)及生物科用字,沒有包含日文平假名及片假名字母。
2.3 GBK字符集
GBK由國家信息技術(shù)標(biāo)準(zhǔn)化技術(shù)委員會于1995年12月制定,共有20902個漢字。GBK編碼中漢字分為兩類:一類是簡體字,即原來GB碼中的漢字,通常稱為GBK簡體;另一類是繁體字,即原來BIG5碼中的漢字,通常稱為GBK繁體。因此,GB2312中的漢字編碼與GBK中的簡體漢字相同。GBK中每個漢字仍然包含兩個字節(jié),第一個字節(jié)的編碼范圍是0x81至0xFE,即十進(jìn)制的129至254;第二個字節(jié)的編碼范圍是0x40至0xFE,即十進(jìn)制的64至254。GBK向下兼容GB2312,向上支持ISO 10646.1國際標(biāo)準(zhǔn)。不規(guī)范理解為GB即GBK簡體。
顯然,繁體不等同于BIG5。GBK集中有繁體,GB12345集也有繁體,但這三者的漢字編碼方式不同。Windows95/98/NT/2000/XP(簡體)都使用GBK字符集。
2.4 GB18030字符集
GB 18030全稱為GB18030-2000《信息交換用漢字編碼字符集基本集的擴(kuò)充》,我國于2000年3月發(fā)布,2001年8月后在中國市場上發(fā)布的軟件必須符合此標(biāo)準(zhǔn)。GB18030字符集標(biāo)準(zhǔn)解決漢字、日文假名、朝鮮語和中國少數(shù)民族文字組成的大字符集計算機(jī)編碼問題,其字符總編碼空間超過150萬個編碼位,收錄了27484個漢字,覆蓋中文、日文、朝鮮語和中國少數(shù)民族文字。滿足中國大陸、香港、臺灣、日本和韓國等東亞地區(qū)信息交換多文種、大字量、多用途、統(tǒng)一編碼格式的要求,并且與以前的國家字符編碼標(biāo)準(zhǔn)兼容。
GB 18030標(biāo)準(zhǔn)采用單字節(jié)、雙字節(jié)和四字節(jié)三種方式對字符編碼。單字節(jié)部分使用0x00至0x7F碼(對應(yīng)于ASCII碼的相應(yīng)碼)。雙字節(jié)部分,首字節(jié)碼從0x81至0xFE,尾字節(jié)碼位分別是0x40至0x7E和0x80至0×FE。四字節(jié)部分采用GB/T 11383未采用的0x30至0x39作為對雙字節(jié)編碼擴(kuò)充的后綴,這樣擴(kuò)充的四字節(jié)編碼,其范圍為0x81308130至0xFE39FE39。其中,第一、三個字節(jié)編碼碼位均為0x81至0xFE,第二、四個字節(jié)編碼碼位均為0x30至0x39。
上述漢字編碼字符集涵蓋了常見的漢字,但對于地方字、異形字等生僻字則在上述編碼字符集中無法找到??紤]到地圖數(shù)據(jù)中可能存在的生僻字,需要針對此情況進(jìn)行單獨設(shè)計。具體如下:首先把數(shù)據(jù)中出現(xiàn)的所有生僻字進(jìn)行匯總,然后按照一定的順序給每個生僻字配一個以字母和數(shù)字組合的編碼,如A001。在數(shù)據(jù)中就用編碼來代替這些生僻字,同時建立生僻字庫,將需要用到的生僻字對一一對應(yīng)到相應(yīng)的編碼中。此編碼應(yīng)與已有的編碼相異,且編碼規(guī)則按照常見字編碼規(guī)則進(jìn)行設(shè)計和考慮。為達(dá)到生僻字與編碼一一對應(yīng)的目的,經(jīng)過研究后發(fā)現(xiàn),只要擴(kuò)充現(xiàn)有的標(biāo)準(zhǔn)字庫,制作一個1∶50 000 基礎(chǔ)地理信息數(shù)據(jù)專用生僻字庫,就可以達(dá)到地圖中生僻字與編碼一一對應(yīng)的目標(biāo)。生僻字庫的具體制作流程如圖1所示:
圖1 生僻字庫制作流程
此時,這個生僻字庫只是一個獨立的字庫,還不能與標(biāo)準(zhǔn)字庫一起使用。因此,需要把這個生僻字庫中的字追加到我們的標(biāo)準(zhǔn)字庫中,使之成為一個擴(kuò)充的標(biāo)準(zhǔn)字庫。這樣,生僻字庫中的字就可以像那些常用字一樣為用戶所使用。
編碼轉(zhuǎn)換的實現(xiàn)需要解決以下五個問題:首先,需要確定待轉(zhuǎn)換文件中是否包含漢字編碼字符;其次,如果檢測到轉(zhuǎn)換文件包含漢字編碼,則需要確定文件中漢字的編碼標(biāo)準(zhǔn);第三,依據(jù)文件的漢字編碼標(biāo)準(zhǔn),使用編碼轉(zhuǎn)換算法將源文件漢字編碼轉(zhuǎn)換為所需要的漢字編碼,同時確保文件中的非漢字字節(jié)不能有任何變化;第四,確定文件中的漢字是否為生僻字,若是,則建立生僻字編碼對照表,將源文件生僻字編碼轉(zhuǎn)換為所需要的漢字編碼;最后,考慮到數(shù)字地圖通常會包含大量的數(shù)據(jù)文件,因此漢字轉(zhuǎn)換算法需要有較高的算法效率。
4.1 漢字編碼標(biāo)準(zhǔn)的確定
對文件中的漢字編碼進(jìn)行轉(zhuǎn)換,首先需要判斷文件中是否包含中文編碼字符。因為需要轉(zhuǎn)換的僅僅是中文字符,文件中的任何非中文字節(jié)必須保持。
中文字符具有兩個顯著的特點:第一,西文字符,例如ASCII碼,用一個字節(jié)來表示,而中文字符用兩個字節(jié)來表示;第二,西文字符編碼范圍是0至127,而中文字符編碼中至少有一個字節(jié)是128至255。
對于一個文本文件,除了中西文字符之外,還有回車、換行等控制字符。盡管這些控制字符在打印和顯示時不可見,但是其編碼也是一個字節(jié),且小于128。
如果我們用fstByte表示文件中相鄰兩個字節(jié)的第一字節(jié),用sndByte表示第二字節(jié)。對于純文本文件,則可以通過下述算法確定文件中是否包含漢字以及漢字的編碼標(biāo)準(zhǔn)。
(1)如果第一字節(jié)fstByte和第二字節(jié)sndByte滿足:
① fstByte>=0x81并且fstByte<=0xfe;
② sndByte>=0x40并且sndByte<=0xfe;
則該文件包含中文字符,且中文字符采用了GBK編碼。
(2)如果第一字節(jié)fstByte和第二字節(jié)sndByte滿足:
① fstByte>=0xb0并且fstByte<=0xf7;
② sndByte >=0xa0 并且sndByte <=0xfe;
則該文件包含中文字符,且中文字符采用了GB2312編碼。
(3) 如果第一字節(jié)fstByte和第二字節(jié)sndByte滿足:
① fstByte>=0x81并且fstByte<=0xfe;
② sndByte >=0x40并且sndByte<=0x7e;
或者
sndByte >=0xa1并且sndByte <=0xfe;
則該文件包含中文字符,且中文字符采用了BIG5編碼。
(4) 不滿足上述條件的字節(jié)作為非中文單字節(jié)處理。
使用上述算法時,隱含了一個基本約束條件:同一個文件中,所有中文字符均采用同一種中文字符編碼。在實際的數(shù)字地圖文件中,這一基本約束能夠得到滿足。因此,可以利用這個基本約束來校驗和確認(rèn)判定結(jié)果。
通過上述算法,既可以自動確定每一個文件是否包含中文字符,又能夠同時確定字符的編碼標(biāo)準(zhǔn)。
4.2 漢字編碼查找表
中文字符根據(jù)其給定的編碼存放于編碼表中。顯式表達(dá)的漢字編碼通常是編碼矩陣表。圖2給出了GB2312-80編碼表的例子;圖3給出了GBK編碼表的例子;圖4給出了生僻字編碼表的例子。
圖2 GB2312 編碼表(部分)
圖3 GBK編碼表(部分)
圖4 生僻字編碼表(部分)
在計算機(jī)中,我們采用線性查找表存儲漢字編碼表,以方便編碼轉(zhuǎn)換。在線性表中,字符的存儲位置與其編碼具有一定的關(guān)系,其漢字編碼在線性查找表的位置按下述公式計算:
假設(shè)輸入的兩字節(jié)漢字編碼的第一字節(jié)是B1、第二字節(jié)是B2。對于GB2312編碼查找表TGB,該字符在TGB中的起始位置P是:
P(TGB)=2*((B1-176)*94+B2-161)
(1)
對于GBK編碼查找表TGBK,該字符在TGBK中的起始位置P是:
P(TGBK)=2*((B1-129)*191+B2-64)
(2)
對于BIG5編碼查找表TBIG5,該字符在TBIG5中的起始位置P是:
P(TBIG5)=2*((B1-161)*157+B2-64)
(3)
對于生僻字這類編碼,由于已將生僻字庫追加到標(biāo)準(zhǔn)字庫中,因此可直接在標(biāo)準(zhǔn)字庫中采用順序查找的方法獲取生僻字對應(yīng)的編碼。
4.3 漢字編碼轉(zhuǎn)換
不同的漢字編碼之間具有確定的對應(yīng)關(guān)系,兩種漢字編碼之間的轉(zhuǎn)換依賴于這種編碼定義。因此,最簡單的編碼轉(zhuǎn)換就是建立兩類編碼的對照表,通過查找編碼對照表實現(xiàn)編碼轉(zhuǎn)換。例如,對于從BIG5到GBK的漢字編碼轉(zhuǎn)換,可以在BIG5編碼查找表位置給出BIG5相應(yīng)漢字的GBK編碼以構(gòu)成編碼對照表;也可以在GBK編碼查找表位置給出GBK相應(yīng)漢字的BIG5編碼以構(gòu)成編碼對照表;對于生僻字,從生僻字編碼表中對照轉(zhuǎn)換,并在漢字編碼轉(zhuǎn)換中保持不變。下面以BIG5編碼轉(zhuǎn)換為GBK碼為例,給出編碼轉(zhuǎn)換的具體算法實例。
假設(shè)CvTable是BIG5碼至GBK碼的編碼對照表,編碼轉(zhuǎn)換算法步驟是:
①打開源文件;
②從文件中讀取一個字節(jié)S1stByte;
③如果(S1stByte>=0x81)并且(S1stByte<=0xfe),則
{
④讀取文件下一個字節(jié)S2ndByte;
⑤ 如果文件結(jié)束,則將S1stByte寫入目標(biāo)文件,轉(zhuǎn)步驟⑥;否則
{
如果S2ndByte>=0x40并且S2ndByte<=0x7e或者S2ndByte>=0xa1并且S2ndByte<=0xfe,則按公式(2)計算BIG5字符在GBK查找表中的位置P,在CvTable中按照位置P順序讀取兩個字節(jié)并依次寫入目標(biāo)文件;否則將S1stByte寫入目標(biāo)文件,將S2ndByte賦值到S1stByte,然后轉(zhuǎn)步驟③;
}
}
否則,將S1stByte寫入目標(biāo)文件,轉(zhuǎn)步驟②;
⑥ 算法結(jié)束。
我們在windows操作系統(tǒng)下使用C++語言實現(xiàn)了本文的算法設(shè)計,并在實際工作中通過對數(shù)字地圖文件的轉(zhuǎn)換應(yīng)用,對算法的可靠性及算法效率進(jìn)行了驗證。
5.1 編碼轉(zhuǎn)換過程
漢字編碼的轉(zhuǎn)換過程:①源文件的載入;②文件編碼格式分析與確認(rèn),即對文件中漢字所采用的編碼進(jìn)行識別判定;③轉(zhuǎn)換對照表加載,即根據(jù)文件所采用的漢字編碼進(jìn)行加載,對于常見字直接加載相應(yīng)標(biāo)準(zhǔn)的編碼表,對于生僻字則加載依據(jù)本文方法所建立的生僻字編碼表;④漢字編碼轉(zhuǎn)換;⑤轉(zhuǎn)換后目標(biāo)文件輸出。
5.2 交互設(shè)計
界面設(shè)計采用缺省和用戶自定義設(shè)置兩種方式。缺省設(shè)置下,將需要轉(zhuǎn)換的源文件拖入“源文件列表”后系統(tǒng)自動開始文件轉(zhuǎn)換,轉(zhuǎn)換后的文件目錄與源文件目錄相同,文件名為源文件名前添加一個缺省前綴,也可以不使用文件拖放及自動文件轉(zhuǎn)換,界面設(shè)置了通過點擊按鈕開始文件轉(zhuǎn)換過程的使用方式。用戶自定義設(shè)置可以自主設(shè)定目標(biāo)文件前綴、目標(biāo)文件目錄等。文件前綴和文件目錄可以通過鍵盤輸入,也可以通過拖入文件自動獲取[4,5]。
5.3 算法效率分析
(1)時間效率
算法運(yùn)行時間包括讀文件時間、判定每個字節(jié)的時間和字符轉(zhuǎn)換的時間。文件讀寫時間取決于操作系統(tǒng)實現(xiàn),本文不作探討。
假設(shè)文件長度是n個字節(jié),其中,中文字符共有m個。因此,中文字符所占的字節(jié)數(shù)為2m個,非中文字符數(shù)量是n-2m個。從算法描述可知,每個字節(jié)需要做兩次比較,每個中文字符需要做三次加法和兩次乘法以獲得查找表地址,并通過兩次賦值獲得變換后的中文編碼。由于編碼只有一個字節(jié),所以,兩次乘法相當(dāng)于6次加法。即上述計算相當(dāng)于11次加法運(yùn)算。因此,該算法的時間效率可以表示為:
v=2*n+11*m
(4)
當(dāng)文件中沒有中文字符時
v=2*n
(5)
當(dāng)文件中只有中文字符時:
v=15*m<8*n
(6)
可見,算法的時間效率是O(n),即算法具有最優(yōu)的線性時間效率,運(yùn)行所需要時間與文件長度成正比[5]。
(2)空間效率
考慮到算法對文件的上下文相關(guān)性僅涉及相鄰兩個字符,從理論上講,算法的空間效率可以做到僅僅兩個字節(jié)。但從文件讀寫效率方面考慮,可以使用與文件系統(tǒng)數(shù)據(jù)塊大小相同的讀寫緩沖內(nèi)存。比如,對于windows操作系統(tǒng),磁盤文件數(shù)據(jù)分塊大小通??稍O(shè)定為4k。因此,無論數(shù)據(jù)文件大小,算法的空間效率是一個很小的恒定常數(shù)。
本文通過分析漢字字符編碼特點,以常用字和生僻字為對象,建立生僻字庫并對其進(jìn)行編碼,將其追加到標(biāo)準(zhǔn)子庫中。在此基礎(chǔ)上,設(shè)計了一種文本文件的漢字編碼自動識別方法和基于查找表的編碼轉(zhuǎn)換方法。通過算法分析和實驗驗證表明,該方法可以實現(xiàn)一個高效、可靠的漢字字符轉(zhuǎn)換,且涵蓋了常見字和生僻字,適合于較大規(guī)模數(shù)字地圖文件系統(tǒng)的漢字字符轉(zhuǎn)換,較好地解決了數(shù)字地圖中的漢字尤其是生僻字的存儲和顯示等問題。
[1]胡群英,王金霞,方麗.中文字庫及其在測繪生產(chǎn)中的應(yīng)用分析[J].信息技術(shù)與標(biāo)準(zhǔn)化,2009(4):P50-52.
[2]王緒龍.漢字信息處理概說[M] . 南京:南京大學(xué)出版社,1988.
[3]孟祥旭,李學(xué)慶.人機(jī)交互技術(shù)原理與應(yīng)用[M] .北京:清華大學(xué)出版社,2004.
[4]董士海,王衡.人機(jī)交互[M]. 北京:北京大學(xué)出版社,2004.
[5]Alan Dix, Janet Finlay, Human-Computer Interaction, Third Edition[M]. Pearson Education Limited, 2006.
Chinese Characters Encoding Conversion Applicable to Digital Map
Hu Qunying,F(xiàn)u Haojun,Wei Caihong
Technical Division of Surveying and Mapping,Xi’an 710054,China
As a part of cartographic language, character lettering in the digital map plays a more important role in making up the shortage of map symbols and transmission of map information. Based on the characteristics of Chinese processing, this paper proposes an automatic analysis method for the Chinese encoding model and an efficient code conversion algorithm in digital map files using regular-used and rarely-used Chinese characters as the study object. Besides, the paper develops a character encoding conversion software of digital map. Thus it effectively solves the problems of operation and presentation in the digital map system. This method plays an important role in the actual digital map analysis, display and applications.
digital map; Chinese character encoding; code conversion; method study
2015-02-02。
胡群英(1964—),女,高級工程師,主要從事地圖制圖學(xué)與地理信息工程方面的研究。
P208
A