童天添
(江蘇科技大學(xué)學(xué)報(bào)編輯部, 江蘇 鎮(zhèn)江 212003)
任何計(jì)算機(jī)軟件都需要在指定的字符編碼支持下才能運(yùn)行,在互聯(lián)網(wǎng)環(huán)境下,涉及跨國(guó)用戶的計(jì)算機(jī)軟件,更應(yīng)該注意它使用了怎樣的字符代碼體系.計(jì)算機(jī)用戶在使用計(jì)算機(jī)時(shí)常會(huì)遇到字符“亂碼”,特別是在涉外的計(jì)算機(jī)通訊中尤為常見[1-3].當(dāng)今中國(guó)有GB2312簡(jiǎn)體中文字符集,日本有Shift-JIS字符集,國(guó)際上類似這樣一個(gè)國(guó)家對(duì)應(yīng)一套或數(shù)套字符集的現(xiàn)象很多.Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案,它用數(shù)字0~0x10FFFF來(lái)映射這些字符,最多可以容納1 114 112個(gè)字符,或者說(shuō)有1 114 112個(gè)碼位.碼位就是可以分配給字符的數(shù)字.UTF-8,UTF-16,UTF-32都是將數(shù)字轉(zhuǎn)換到程序數(shù)據(jù)的編碼方案.Unicode字符集簡(jiǎn)寫為UCS(Unicode Character Set).Unicode標(biāo)準(zhǔn)有UCS-2,UCS-4.UCS-2用兩個(gè)字節(jié)編碼,UCS-4用4個(gè)字節(jié)編碼.由于 Unicode 版本的發(fā)展原因,很多瀏覽器只能顯示 UCS-2 的完整字符集,即現(xiàn)在使用的 Unicode 版本中的一個(gè)子集.為此,本文以雙字節(jié)編碼空間為研究對(duì)象,用Visual Studio 2005 中的C#語(yǔ)言編寫了字符編碼映射系統(tǒng),分別展示出GB2312 和UCS-2字符集中的所有字符,結(jié)果證明了Unicode字符集在當(dāng)前系統(tǒng)資源充足的情況下,相比其他字符集具有跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的優(yōu)越性.該系統(tǒng)為進(jìn)一步研究實(shí)現(xiàn)期刊采編系統(tǒng)等軟件的國(guó)際化奠定了基礎(chǔ).
UCS-2字符集用一個(gè)16位的值來(lái)表示每個(gè)字符,它已經(jīng)為歐洲拉丁文、擴(kuò)充拉丁文、阿拉伯文、泰文、日文、韓文等外文字母定義了Unicode代碼點(diǎn).該字符集中還包含了大量的標(biāo)點(diǎn)符號(hào)、數(shù)學(xué)符號(hào)、技術(shù)符號(hào)、箭頭、裝飾標(biāo)志、區(qū)分標(biāo)志和其他許多字符.現(xiàn)在USC-2字符集的65 536個(gè)代碼絕大部分已經(jīng)被分配了字符,其中中國(guó)漢字、日文漢字、韓文就占用了超過(guò)一半的代碼[4],這65 536個(gè)字符可以分成不同的區(qū)域.表1顯示了其中的部分區(qū)域的代碼范圍以及分配給這些區(qū)域的字符.
表1 UCS-2字符集區(qū)域分布
Unicode字符集轉(zhuǎn)換格式(UCS Transformation Format,UTF)用來(lái)規(guī)定怎樣將Unicode定義的數(shù)字轉(zhuǎn)換成程序數(shù)據(jù),包括:UTF-8,UTF-16,UTF-32.例如,“漢字”對(duì)應(yīng)的數(shù)字是0x6c49和0x5b57,而編碼的程序數(shù)據(jù)是:
BYTE data_UTF8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8編碼
WORD data_ UTF16[] = {0x6c49, 0x5b57}; // UTF-16編碼
DWORD data_ UTF32[] = {0x00006c49, 0x00005b57}; // UTF-32編碼
把Unicode編碼記作U.對(duì)于U<0x10000,UTF-8,UTF-16,UTF-32的編碼規(guī)則分別如下:
(1)UTF-8以字節(jié)為單位對(duì)Unicode進(jìn)行編碼,從U到UTF-8的編碼方式如下:
U║ UTF-8 字節(jié)流(二進(jìn)制)
0x0000~0x007F ║ 0xxxxxxxB
0x0080~0x07FF ║ 110xxxxxB10xxxxxxB
0x0800~0xFFFF ║ 1110xxxxB10xxxxxxB10xxxxxxB
(2)UTF-16編碼以16位無(wú)符號(hào)整數(shù)為單位.U的UTF-16編碼就是U對(duì)應(yīng)的16位無(wú)符號(hào)整數(shù).
(3)UTF-32編碼以32位無(wú)符號(hào)整數(shù)為單位.U的UTF-32編碼就是其對(duì)應(yīng)的32位無(wú)符號(hào)整數(shù).
圖1 字符生成流程圖
圖1為字符編碼映射系統(tǒng)中的字符生成流程圖.從開始到結(jié)束,完成一套雙字節(jié)編碼空間字符集的生成過(guò)程,所使用的Unicode字符集轉(zhuǎn)換格式為UTF-16.圖2 為字符編碼映射系統(tǒng)顯示USC-2字符集的運(yùn)行截圖.程序用dataGridView控件的單元格存放生成的字符.dataGridView控件每行存放32個(gè)字符,列頭標(biāo)以0x00~0x1F連續(xù)編號(hào).以UCS-2字符集為例,UCS-2字符集共有65 536個(gè)碼位,所以dataGridView控件的總行數(shù)為65 535/16=4 096行,行頭標(biāo)以0x0000~0xFFE0非連續(xù)編號(hào).點(diǎn)擊“顯示USC-2字符集”按紐和“顯示GB2312字符集”按紐,分別在dataGridView控件中顯示相應(yīng)字符集的所有字符.
顯示USC-2字符集的程序代碼如下:
private void button1_Click(object sender, EventArgs e)
{
byte[] by16=new byte[2];
for (int i = 0; i < 65536; i++)
{
by16[0] = Convert.ToByte(i% 256); //i取余給底字節(jié)
by16[1] = Convert.ToByte(i/256); //i取整給高字節(jié)
dataGridView1[i% 32, i/32].Value = ncoding.Unicode.GetString(by16);//UNICODE字符賦給單元格
}
}
顯示GB2312字符集的程序代碼如下:
private void button2_Click(object sender,EventArgs e)
{
byte[] by16 = new byte[2];
for (int i = 0; i < 65536; i++)
{
by16[0] = Convert.ToByte(i% 256); //i取余給底字節(jié)
by16[1] = Convert.ToByte(i/256); //i取整給高字節(jié)
dataGridView1[i% 32, i/32].Value =
Encoding.GetEncoding(“GB2312”).GetString(by16); //GB2312字符賦給單元格
}
}
圖2 字符編碼映射系統(tǒng)運(yùn)行截圖
下面是通過(guò)本文設(shè)計(jì)的字符編碼映射系統(tǒng)生成的一部分Unicode字符,最前面的十六進(jìn)制數(shù)字是后面32個(gè)字符中第一個(gè)字符的編碼.
通過(guò)了解Unicode的設(shè)計(jì)初衷和用設(shè)計(jì)的程序驗(yàn)證USC-2字符集中的字符,我們可以知道Unicode是一種在計(jì)算機(jī)上使用的字符編碼,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求.Unicode標(biāo)準(zhǔn)有UCS-2和UCS-4.UCS-2用兩個(gè)字節(jié)編碼,UCS-4用4個(gè)字節(jié)編碼.Unicode還在不斷的發(fā)展,Unicode 4.1.0版本于2005年3月31日推出.另外,5.0 Beta版本于2005年12月12日推出,5.2版本于2009年10月1日正式推出.
Unicode技術(shù)有其廣泛的應(yīng)用價(jià)值,它是今后軟件設(shè)計(jì)中字符編碼方式的一種趨勢(shì).本文所設(shè)計(jì)的映射系統(tǒng)是進(jìn)行軟件國(guó)際化研究工作的基礎(chǔ).以學(xué)報(bào)采編系統(tǒng)為例,我國(guó)科技期刊的編委和審稿幾乎均局限在國(guó)內(nèi),難以爭(zhēng)取境外稿源,也不可能在國(guó)際市場(chǎng)上暢銷[5].從采編系統(tǒng)的技術(shù)層面分析,編委、審稿人隊(duì)伍的國(guó)際化,稿源的國(guó)際化,銷售市場(chǎng)的國(guó)際化,必然要求能兼容世界各國(guó)語(yǔ)言的統(tǒng)一編碼標(biāo)準(zhǔn),這正是Unicode編碼標(biāo)準(zhǔn)所能滿足我們的.
(1)本文以雙字節(jié)編碼空間為研究對(duì)象,用其編碼空間映射出GB2312 和USC-2字符集中的所有字符,所用的方法具有通用性.對(duì)于其他的字符集,如日文Shift-JIS字符集,用該方法同樣可以獲得相應(yīng)字符集中的所有字符.
(2)本文所設(shè)計(jì)的字符編碼映射系統(tǒng)是研究軟件系統(tǒng)跨語(yǔ)言、跨平臺(tái)運(yùn)用的基礎(chǔ).它作為一個(gè)工具,在今后的相關(guān)軟件的研發(fā)中必將經(jīng)常使用到.
(3)Unicode具有跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的特性.雖然在USC-4標(biāo)準(zhǔn)中每個(gè)字符有4個(gè)字節(jié)編碼,較其他編碼方案更加消耗存儲(chǔ)空間,但在當(dāng)前系統(tǒng)資源充足的情況下,它將是今后軟件中字符編碼的一種趨勢(shì).
參考文獻(xiàn)
[1]高 煒, 劉 偉,趙長(zhǎng)青.基于Windows的中文軟件移植到UNICODE的方法研究[J].軟件導(dǎo)刊,2008,(5):19-20.
[2]張愛優(yōu).圖書館自動(dòng)化管理系統(tǒng)的新型編碼系統(tǒng)[J].圖書館雜志,2001,20(12):19-21.
[3]馬玉芝, 李 俊.基于UNICODE的多民族文字處理在移動(dòng)終端上的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2006,26(1):234-236.
[4] 李建文,張成現(xiàn).實(shí)用網(wǎng)絡(luò)通信編程技術(shù)[M]. 北京:北京郵電大學(xué)出版社,2006.
[5]余麗清.我國(guó)科技期刊國(guó)際化探討[J].中國(guó)科技期刊研究,2006,17(3):495-497.