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