我們日常接觸到的文件分ASCII和Binary兩種。ASCII是“美國信息交換標準編碼”的英文字頭縮寫,可稱之為“美標”。美標規定了用從0到127的128個數字來代表信息的規範編碼,其中包括33個控制碼,壹個空格碼,和94個形象碼。形象碼中包括了英文大小寫字母,阿拉伯數字,標點符號等。我們平時閱讀的英文電腦文本,就是以形象碼的方式傳遞和存儲的。美標是國際上大部分大小電腦的通用編碼。
然而電腦中的壹個字符大都是用壹個八位數的二進制數字表示。這樣每壹字符便可能有256個不同的數值。由於美標只規定了128個編碼,剩下的另外128個數碼沒有規範,各家用法不壹。另外美標中的33個控制碼,各廠家用法也不盡壹致。這樣我們在不同電腦間交換文件的時候,就有必要區分兩類不同的文件。第壹類文件中每壹個字都是美標形象碼或空格碼。這類文件稱為“美標文本文件”(ASCII Text Files),或略為“文本文件”,通常可在不同電腦系統間直接交換。第二類文件,也就是含有控制碼或非美標碼的文件,通常不能在不同電腦系統間直接交換。這類文件有壹個通稱,叫“二進制文件”(Binary Files)。 “國標”是“中華人民***和國國家標準信息交換用漢字編碼”的簡稱。國標表(基本表)把七千余漢字、以及標點符號、外文字母等,排成壹個94行、94列的方陣。方陣中每壹橫行叫壹個“區”,每個區有九十四個“位”。壹個漢字在方陣中的坐標,稱為該字的“區位碼”。例如“中”字在方陣中處於第54區第48位,它的區位碼就是5448。
其實94這個數字。它是美標中形象碼的總數。國標表沿用這個數字,本意大概是要用兩個美標形象符代表壹個漢字。由於美標形象符的編碼是從33到126,漢字區位碼如果各加上32,就會與美標形象碼的範圍重合。如上例“中”字區、位碼加上32後,得86,80。這兩個數字的十六進制放在壹起得5650,稱為該字的“國標碼”,而與其相對應的兩個美標符號,VP,也就是“中”字的“國標符”了。
這樣就產生了壹個如何區分國標符與美標符的問題。在壹個中英文混用的文件裏,“VP”到底代表“中”字呢,還是代表某個英文字頭縮寫?電子工業部第六研究所開發CCDOS的時候,使用了壹個簡便的解決方案:把國標碼的兩個數字各加上128,上升到非美標碼的位置。(改變後的國標碼,習慣上仍叫“國標”。)
這個方案固然解決了原來的問題,可是新的問題隨之產生。中文文件成了“二進制文件”,既不能可靠地在不同電腦系統間交換,也不與市場上大部分以美標符號為設計對象的軟件兼容。
為了區分以上兩種“國標”,我們把原與美標形象碼重合的國標碼稱為“純國標” ,而把CCDOS加上128的國標碼稱為“準國標”。 GBK碼是GB碼的擴展字符編碼,對多達2萬多的簡繁漢字進行了編碼,簡體版的Win95和Win98都是使用GBK作系統內碼。
從實際運用來看,微軟自win95簡體中文版開始,系統就采用GBK代碼,它包括了TrueType宋體、黑體兩種GBK字庫(北京中易電子公司提供),可以用於顯示和打印,並提供了四種GBK漢字的輸入法。此外,瀏覽器IE4.0簡體、繁體中文版內部提供了壹個GBK-BIG5代碼雙向轉換功能。此外,微軟公司為IE提供的語言包中,簡體中文支持(Simplified Chinese Language Support Kit)的兩種字庫宋體、黑體,也是GBK漢字(珠海四通電腦排版系統開發公司提供)。其他壹些中文字庫生產廠商,也開始提供TrueType或PostScript GBK字庫。
許多外掛式的中文平臺,如南極星、四通利方(Richwin)等,提供GBK碼的支持,包括字庫、輸入法和GBK與其他中文代碼的轉化器。
互聯網方面,許多網站網頁使用GBK代碼。
但是多數搜索引擎都不能很好的支持GBK漢字搜索,大陸地區的搜索引擎有些能不完善的支持GBK漢字檢索。
其實,GBK是又壹個漢字編碼標準,全稱《漢字內碼擴展規範》(Chinese Internatial Code Specification),1995年頒布。GB是國標,K是漢字“擴展”的漢語拼音第壹個字母。
GBK向下與GB-2312編碼兼容,向上支持ISO 10646.1國際標準,是前者向後者過渡的壹個承啟標準。
GBK規範收錄了ISO 10646.1中的全部CJK漢字和符號,並有所補充。具體包括:GB 2312中的全部漢字、非漢字符號;GB 13000.1中的其他CJK漢字。以上合計20902個GB化漢字;《簡化總表中》未收入GB 13000.1的52個漢字;《康熙字典》以及《辭海》中未被收入GB 13000.1的28個部首及重要構件;13個漢字結構符;BIG-5中未被GB 2312收入、但存在於GB 13000.1的139個圖形符號;GB 12345增補的6個拼音符號;GB 12345增補的19個豎排圖形符號(GB 12345較GB 2312增補豎排標點符號29個,其中10個未被GB 13000.1收入,故GBK亦不收);從GB 13000.1的CJK兼容區挑選出的21個漢字;GB 13000.1收入的31個IBM OS/2專用符號。GBK亦采用雙字節表示,總體編碼範圍為0x8140~0xFEFE之間,首字節在0x81~0xFE之間,尾字節在0x40~0xFE之間,剔除0x××7F壹條線,總計23940個碼位,***收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003個,圖形符號883個。 HZ 碼是中國留學生為了使漢字信息能在網絡上直接傳送而產生的。因目前大多數 (西方)網絡系統為7位,最高位被屏蔽掉,因此 GB 碼無法被直接傳輸,HZ 碼是為了達到在7位網絡系統中直接傳遞漢字信息的目的而規範的。
“HZ”方案的特點,是以“純國標”的中文與美標碼混用。那麽“HZ”是怎樣區分國標符和美標符的呢?答案其實也很簡單:當壹串美標碼中間插入壹段國標碼的時候,我們便在國標碼的前面加上~,後面加上~。這些附加碼分別叫“逃出碼”和“逃入碼”。 由於這些附加碼本身也是美標形象碼,整個文件就儼然是壹個美標文本文件,可以安然地 在電腦網上傳遞,也和大部分英文文本處理軟件兼容。 1993年,國際標準ISO10646 定義了通用字符集(Universal Character Set, UCS)。 UCS 是所有其他字符集標準的壹個超集。它保證與其他字符集是雙向兼容的。就是說, 如果妳將任何文本字符串翻譯到 UCS格式,然後再翻譯回原編碼, 妳不會丟失任何信息。
UCS 包含了用於表達所有已知語言的字符。不僅包括拉丁語,希臘語,斯拉夫語,希伯來語,阿拉伯語,亞美尼亞語和喬治亞語的描述, 還包括中文,日文和韓文這樣的象形文字,以及平假名,片假名,孟加拉語,旁遮普語果魯穆奇字符(Gurmukhi),泰米爾語, 印.埃納德語(Kannada),Malayalam,泰國語, 老撾語, 漢語拼音(Bopomofo), Hangul,Devangari,Gujarati, Oriya,Telugu 以及其它語種。對於還沒有加入的語言, 由於正在研究怎樣在計算機中最好地編碼它們, 因而最終它們都將被加入。這些語言包括Tibetian,高棉語,Runic(古代北歐文字),埃塞俄比亞語, 其他象形文字,以及各種各樣的印-歐語系的語言,還包括挑選出來的藝術語言比如 Tengwar,Cirth 和克林貢語(Klingon)。UCS 還包括大量的圖形的,印刷用的,數學用的和科學用的符號,包括所有由 TeX,Postscript,MS-DOS,MS-Windows, Macintosh, OCR字體, 以及許多其他字處理和出版系統提供的字符。
ISO 10646 定義了壹個 31 位的字符集。 然而, 在這巨大的編碼空間中, 迄今為止只分配了前 65534 個碼位 (0x0000 到 0xFFFD)。這個UCS的16位子集稱為基本多語言面 (Basic Multilingual Plane, BMP)。 將被編碼在16位BMP以外的字符都屬於非常特殊的字符(比如象形文字), 且只有專家在歷史和科學領域裏才會用到它們。按當前的計劃, 將來也許再也不會有字符被分配到從0x000000到0x10FFFF這個覆蓋了超過100萬個潛在的未來字符的 21 位的編碼空間以外去了。ISO 10646-1標準第壹次發表於1993年, 定義了字符集與 BMP 中內容的架構。定義 BMP以外的字符編碼的第二部分 ISO 10646-2 正在準備中, 但也許要過好幾年才能完成。新的字符仍源源不斷地加入到 BMP 中, 但已經存在的字符是穩定的且不會再改變了。
UCS 不僅給每個字符分配壹個代碼, 而且賦予了壹個正式的名字。表示壹個 UCS 或 Unicode 值的十六進制數, 通常在前面加上 “U+”, 就象U+0041 代表字符“拉丁大寫字母A”。UCS字符U+0000到U+007F 與 US-ASCII(ISO 646) 是壹致的, U+0000 到 U+00FF 與 ISO8859-1(Latin-1) 也是壹致的。從 U+E000 到 U+F8FF,已經BMP 以外的大範圍的編碼是為私用保留的。
1993年,ISO10646中定義的USC-4 (Universal Character Set) ,使用了4 個字節的寬度以容納足夠多的相當可觀的空間,但是這個過於肥胖的字符標準在當時乃至21世紀都有其不現實的壹面,就是會過分侵占存儲空間並影響信息傳輸的效率。 與此同時,Unicode 組織於約 10 年前以 Universal, Unique和Uniform 為主旨也開始開發壹個16位字符標準, 為避免兩種16位編碼的競爭,1992年兩家組織開始協商,以期折衷尋找***同點,這就是今天的 UCS-2 (BMP,Basic Multilingual Plane,16bit) 和Unicode,但它們仍然是不同的方案。
Unicode
關於Unicode我們需要追溯壹下它產生的淵源。
當計算機普及到東亞時,遇到了使用表意字符而非字母語言的中、日、韓等國家。在這些國家使用的語言中常用字符多達幾千個,而原來字符采用的是單字節編碼,壹張代碼頁中最多容納的字符只有2^8=256個,對於使用表意字符的語言是在無能為力。既然壹個字節不夠,自然人們就采用兩個字節,所有出現了使用雙字節編碼的字符集(DBCS)。不過雙字節字符集中雖然表意字符使用了兩個字節編碼,但其中的ASCII碼和日文片假名等仍用單字節表示,如此壹來給程序員帶來了不小的麻煩,因為每當涉及到DBCS字符串的處理時,總是要判斷當中的壹個字節到底表示的是壹個字符還是半個字符,如果是半個字符,那是前壹半還是後壹半?由此可見DBCS並不是壹種非常好的解決方案。
人們在不斷尋找這更好的字符編碼方案,最後的結果就是Unicode誕生了。Unicode其實就是寬字節字符集,它對每個字符都固定使用兩個字節即16位表示,於是當處理字符時,不必擔心只處理半個字符。
Unicode在網絡、Windows系統和很多大型軟件中得到應用。