刨根究底字符編碼之七——ANSI編碼與代碼頁(Code Page)

ANSI編碼與代碼頁(Code Page)

一、ANSI編碼

1.

如前所述,在全世界所有國家和民族的文字符號統(tǒng)一編碼的Unicode編碼方案問世之前,各個國家、民族為了用計算機記錄并顯示自己的字符,都在ASCII編碼方案的基礎(chǔ)上,設(shè)計了各自的編碼方案。

比如歐洲先后設(shè)計了EASCII和ISO/IEC 8859系列字符編碼方案;為了顯示中文及相關(guān)字符,中國設(shè)計了GB系列編碼(“GB”為“國標(biāo)”的漢語拼音首字母縮寫,即“國家標(biāo)準”之意)。

同樣,日文、韓文、世界各國文字都有它們各自的編碼。所有這些各個國家和地區(qū)所獨立制定的既兼容ASCII又互相不兼容的字符編碼,微軟統(tǒng)稱為ANSI編碼。

所以,即使知道是ANSI編碼,還需要知道這是哪一個國家的才能解碼;另外,也無法用同一種ANSI編碼表示既有漢字、又有韓文的文本。

2.

嚴格來說,ANSI的字面意思并非字符編碼,而是美國的一個非營利組織——美國國家標(biāo)準學(xué)會(American National Standards?Institute)的縮寫。ANSI這個組織做了很多標(biāo)準制定工作,包括C語言規(guī)范ANSI C,還有各國字符編碼對應(yīng)的“代碼頁(code page)”標(biāo)準。(具體什么是代碼頁,詳見后文解釋)

ANSI規(guī)定簡體中文GB編碼的代碼頁是936,所以GB編碼又叫做ANSI code page 936(ANSI標(biāo)準的代碼頁936),各國編碼之所以被微軟統(tǒng)稱為ANSI編碼的原因即在這里。

后來,或許是出于沿用統(tǒng)一的稱呼之目的,有些在當(dāng)時還并未被ANSI定為標(biāo)準的代碼頁,也被微軟稱之為ANSI代碼頁,比如CP943代碼頁。

在Windows系統(tǒng)的編碼處理中,ANSI編碼一般代表系統(tǒng)默認編碼方式,而且并不是確定的某一種編碼方式——在簡體中文操作系統(tǒng)中ANSI編碼默認指的是GB系列編碼(GB2312、GBK、GB18030);在繁體中文操作系統(tǒng)中ANSI編碼默認指的是BIG5;在日文操作系統(tǒng)中ANSI編碼默認指的是Shift JIS,等等??稍谙到y(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)的字符集之間并非完全等同,往往因為種種原因(比如標(biāo)準跟不上現(xiàn)實實踐的需要)而會對字符集有所擴展。

2.

早期,代碼頁是IBM稱呼計算機的BIOS所支持的字符集編碼。當(dāng)時通用的操作系統(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ù)字來標(biāo)記不同的字符集,不同的廠商對同一個字符集使用各自不同的名稱。

例如,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ū)用戶的文化背景和生活習(xí)慣,在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(標(biāo)準和格式):

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的標(biāo)準配置。微軟公司將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)載請注明出處)


上一篇:刨根究底字符編碼之六——簡體漢字編碼中區(qū)位碼、國標(biāo)碼、內(nèi)碼、外碼、字形碼的區(qū)別及關(guān)系

下一篇:刨根究底字符編碼之八——Unicode編碼方案概述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容