1.
如前所述,在全世界所有國家和民族的文字符號統(tǒng)一編碼的Unicode編碼方案問世之前,各個國家、民族為了用計算機記錄并顯示自己的字符,都在ASCII編碼方案的基礎(chǔ)上,設(shè)計了各自的編碼方案。
比如歐洲先后設(shè)計了EASCII和ISO/IEC 8859系列字符編碼方案;為了顯示中文及相關(guān)字符,中國設(shè)計了GB系列編碼(“GB”為“國標”的漢語拼音首字母縮寫,即“國家標準”之意)。
同樣,日文、韓文、世界各國文字都有它們各自的編碼。所有這些各個國家和地區(qū)所獨立制定的既兼容ASCII又互相不兼容的字符編碼,微軟統(tǒng)稱為ANSI編碼。
所以,即使知道是ANSI編碼,還需要知道這是哪一個國家的才能解碼;另外,也無法用同一種ANSI編碼表示既有漢字、又有韓文的文本。
2.
嚴格來說,ANSI的字面意思并非字符編碼,而是美國的一個非營利組織——美國國家標準學會(American National Standards Institute)的縮寫。ANSI這個組織做了很多標準制定工作,包括C語言規(guī)范ANSI C,還有各國字符編碼對應(yīng)的“代碼頁(code page)”標準。(具體什么是代碼頁,詳見后文解釋)
ANSI規(guī)定簡體中文GB編碼的代碼頁是936,所以GB編碼又叫做ANSI code page 936(ANSI標準的代碼頁936),各國編碼之所以被微軟統(tǒng)稱為ANSI編碼的原因即在這里。
后來,或許是出于沿用統(tǒng)一的稱呼之目的,有些在當時還并未被ANSI定為標準的代碼頁,也被微軟稱之為ANSI代碼頁,比如CP943代碼頁。
在Windows系統(tǒng)的編碼處理中,ANSI編碼一般代表系統(tǒng)默認編碼方式,而且并不是確定的某一種編碼方式——在簡體中文操作系統(tǒng)中ANSI編碼默認指的是GB系列編碼(GB2312、GBK、GB18030);在繁體中文操作系統(tǒng)中ANSI編碼默認指的是BIG5;在日文操作系統(tǒng)中ANSI編碼默認指的是Shift JIS,等等。可在系統(tǒng)區(qū)域設(shè)置的系統(tǒng)Locale中更改。
(笨笨阿林原創(chuàng)文章,轉(zhuǎn)載請注明出處)
二、代碼頁(Code Page)
1.
代碼頁也稱為“內(nèi)碼表”,是與特定語言的字符集相對應(yīng)的一張表。操作系統(tǒng)中不同的語言和區(qū)域設(shè)置可能使用不同的代碼頁。
例如,微軟所用的ANSI代碼頁1252(CP1252)對應(yīng)于ISO 8859-1字符集(即Latin-1字符集,但CP1252對Latin-1有擴展,其中編碼128~159也被定義了字符,這是與Latin-1字符集不同之處),用于英語和大多數(shù)歐洲語言(西班牙語和各種日耳曼/斯堪的納維亞語),而IBM所用的OEM代碼頁932(CP932)對應(yīng)于Shift JIS字符集(但CP932對Shift JIS有擴展;另外,對應(yīng)的微軟ANSI代碼頁為CP943,也對Shift JIS有擴展),用于日本字符。
代碼頁一般與其所直接對應(yīng)的字符集之間并非完全等同,往往因為種種原因(比如標準跟不上現(xiàn)實實踐的需要)而會對字符集有所擴展。
2.
早期,代碼頁是IBM稱呼計算機的BIOS所支持的字符集編碼。當時通用的操作系統(tǒng)都是命令行界面的,這些操作系統(tǒng)直接使用BIOS提供的字符繪制功能來顯示字符(或者是一組嵌入在顯卡字符生成器中的字形)。這些BIOS代碼頁也被稱為OEM代碼頁。
隨著圖形用戶界面操作系統(tǒng)的廣泛使用(最初被廣為接受的圖形用戶界面操作系統(tǒng)是Windows3.1),操作系統(tǒng)本身具有了字符繪制的功能。微軟于是在Windows操作系統(tǒng)沒有轉(zhuǎn)向UTF-16(UTF-16的推出要早于現(xiàn)在被廣為認可的UTF-8)作為編碼實現(xiàn)之前(即Windows2000發(fā)布之前),定義了一系列支持不同國家和地區(qū)所制定的字符集的代碼頁,被稱作“Windows代碼頁”或“ANSI代碼頁”。代表性的是實現(xiàn)了ISO-8859-1(即Latin-1)的代碼頁1252(即CP1252),以及實現(xiàn)了GBK的代碼頁936(即CP936)。
3.
代碼頁可以在從字符映射到單字節(jié)值或多字節(jié)值的表格中表現(xiàn)。注意,這里的單字節(jié)值與多字節(jié)值指的是特定于系統(tǒng)平臺的物理意義上的字節(jié)序列,不是指與系統(tǒng)平臺無關(guān)的邏輯意義上的碼元序列。正因為這樣,代碼頁也被稱之內(nèi)碼表。
也就是說,代碼頁是字符集的具體實現(xiàn),可以將其理解為一張“字符-字節(jié)”映射表,通過查表實現(xiàn)“字符-字節(jié)”的翻譯。
代碼頁主要用于字符在計算機中的存儲和顯示,比如,計算機讀取了一個二進制字節(jié),那這個字節(jié)到底代表哪個字符,就需要到指定的代碼頁中查找,這個查找的過程就被稱為查表。
4.
代碼頁的指定在Windows中是系統(tǒng)默認設(shè)置的(即默認系統(tǒng)區(qū)域設(shè)置),也可在(Windows7的)“控制面板-區(qū)域和語言-管理-非Unicode程序的語言-更改系統(tǒng)區(qū)域設(shè)置”中選擇列表中的語言進行更改。
注意:系統(tǒng)區(qū)域設(shè)置System Locale可用于確定在不使用Unicode編碼的程序中輸入和顯示信息的默認字符集和字體,這樣就可以讓非Unicode程序在計算機上使用指定的語言得以正常運行。因此,在計算機上安裝某些非Unicode程序時,可能需要更改默認的系統(tǒng)區(qū)域設(shè)置。為系統(tǒng)區(qū)域設(shè)置選擇不同的語言并不會影響Windows系統(tǒng)本身或其他使用Unicode編碼的程序的菜單和對話框中的語言顯示。
(笨笨阿林原創(chuàng)文章,轉(zhuǎn)載請注明出處)
5.
早期在IBM和微軟內(nèi)部使用數(shù)字來標記不同的字符集,不同的廠商對同一個字符集使用各自不同的名稱。
例如,UTF-8在IBM稱作代碼頁1208,在微軟稱作代碼頁65001,在SAP稱作代碼頁4110;Windows使用936代碼頁(Code Page 936,即CP936)、Mac系統(tǒng)使用EUC-CN代碼頁實現(xiàn)GBK字符集的編碼(EUC:Extended Unix Code;EUC-CN是類Unix系統(tǒng)中GBK編碼方案的別名,等同于Windows下的cp936代碼頁),名字雖然不一樣,但對于同一漢字的編碼肯定是一樣的。
三、微軟Windows操作系統(tǒng)中ANSI代碼頁的設(shè)置
1.
微軟為了適應(yīng)世界上不同地區(qū)用戶的文化背景和生活習慣,在Windows中設(shè)計了區(qū)域(Locale)設(shè)置的功能。
Locale是指特定于某個國家或地區(qū)的一組設(shè)定,包括代碼頁,以及數(shù)字、貨幣、時間和日期的格式等。
在Windows內(nèi)部,其實有兩個Locale設(shè)置:系統(tǒng)Locale和用戶Locale。系統(tǒng)Locale決定代碼頁,用戶Locale決定數(shù)字、貨幣、時間和日期的格式。
可以在Windows控制面板的“區(qū)域和語言選項”中設(shè)置系統(tǒng)Locale(非Unicode程序的語言)和用戶Locale(標準和格式):
(Windows XP中的Locale設(shè)置)
(Windows 7中的Locale設(shè)置)
2.
系統(tǒng)Locale對應(yīng)的代碼頁被作為Windows的默認代碼頁。在沒有明確指定某個文本的編碼信息時,Windows將按照指定的默認代碼頁的編碼方案來解釋該文本數(shù)據(jù)。這個默認代碼頁通常被稱作ANSI代碼頁(ACP)。
在歷史上,IBM的個人計算機和微軟公司的操作系統(tǒng)曾經(jīng)是PC的標準配置。微軟公司將IBM公司定義的代碼頁稱作OEM代碼頁,在IBM公司的代碼頁基礎(chǔ)上作了些增補后,稱為ANSI代碼頁。
在Windows XP的“區(qū)域和語言選項”高級頁面的“代碼頁轉(zhuǎn)換表”中可看到各個語種的代碼頁(Windows7中已經(jīng)不能直接看到了)。例如:
·874 (ANSI/OEM -泰文)
·932 (ANSI/OEM -日文Shift-JIS)
·936 (ANSI/OEM -簡體中文GBK)
·949 (ANSI/OEM -韓文)
·950 (ANSI/OEM -繁體中文Big5)
·1250 (ANSI -中歐)
·1251 (ANSI -西里爾文)
·1252 (ANSI -拉丁文)
·1253 (ANSI -希臘文)
·1254 (ANSI -土耳其文)
·1255 (ANSI -希伯來文)
·1256 (ANSI -阿拉伯文)
·1257 (ANSI -波羅的海文)
·1258 (ANSI/OEM -越南)
(笨笨阿林原創(chuàng)文章,轉(zhuǎn)載請注明出處)
【預(yù)告:下一篇將開始正式講解Unicode編碼方案,敬請關(guān)注!】