刨根究底字元編碼之七——ANSI編碼與代碼頁

一、ANSI編碼

1.

如前所述,在全世界所有國家和民族的文字元號統一編碼的Unicode編碼方案問世之前,各個國家、民族為了用計算機記錄並顯示自己的字元,都在ASCII編碼方案的基礎上,設計了各自的編碼方案。

比如歐洲先後設計了EASCII和ISO/IEC 8859系列字元編碼方案;為了顯示中文及相關字元,中國設計了GB系列編碼(「GB」為「國標」的漢語拼音首字母縮寫,即「國家標準」之意)。

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

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

2.

嚴格來說,ANSI的字面意思並非字元編碼,而是美國的一個非營利組織——美國國家標準學會(American National Standards

Institute)的縮寫。ANSI這個組織做了很多標準制定工作,包括C語言規範ANSI C,還有各國字元編碼對應的「代碼頁(code page)」標準。(具體什麼是代碼頁,詳見後文解釋)

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

後來,或許是出於沿用統一的稱呼之目的,有些在當時還並未被ANSI定為標準的代碼頁,也被微軟稱之為ANSI代碼頁,比如CP943代碼頁。

在Windows系統的編碼處理中,ANSI編碼一般代表系統默認編碼方式,而且並不是確定的某一種編碼方式——在簡體中文操作系統中ANSI編碼默認指的是GB系列編碼(GB2312、GBK、GB18030);在繁體中文操作系統中ANSI編碼默認指的是BIG5;在日文操作系統中ANSI編碼默認指的是Shift JIS,等等。可在系統區域設置的系統Locale中更改。

(笨笨阿林原創文章,轉載請註明出處)

二、代碼頁(Code Page)

1.

代碼頁也稱為「內碼錶」,是與特定語言的字符集相對應的一張表。操作系統中不同的語言和區域設置可能使用不同的代碼頁。

例如,微軟所用的ANSI代碼頁1252(CP1252)對應於ISO 8859-1字符集(即Latin-1字符集,但CP1252對Latin-1有擴展,其中編碼128~159也被定義了字元,這是與Latin-1字符集不同之處),用於英語和大多數歐洲語言(西班牙語和各種日耳曼/斯堪的納維亞語),而IBM所用的OEM代碼頁932(CP932)對應於Shift JIS字符集(但CP932對Shift JIS有擴展;另外,對應的微軟ANSI代碼頁為CP943,也對Shift JIS有擴展),用於日本字元。

代碼頁一般與其所直接對應的字符集之間並非完全等同,往往因為種種原因(比如標準跟不上現實實踐的需要)而會對字符集有所擴展。

2.

早期,代碼頁是IBM稱呼計算機的BIOS所支持的字符集編碼。當時通用的操作系統都是命令行界面的,這些操作系統直接使用BIOS提供的字元繪製功能來顯示字元(或者是一組嵌入在顯卡字元生成器中的字形)。這些BIOS代碼頁也被稱為OEM代碼頁。

隨著圖形用戶界面操作系統的廣泛使用(最初被廣為接受的圖形用戶界面操作系統是Windows3.1),操作系統本身具有了字元繪製的功能。微軟於是在Windows操作系統沒有轉向UTF-16(UTF-16的推出要早於現在被廣為認可的UTF-8)作為編碼實現之前(即Windows2000發布之前),定義了一系列支持不同國家和地區所制定的字符集的代碼頁,被稱作「Windows代碼頁」或「ANSI代碼頁」。代表性的是實現了ISO-8859-1(即Latin-1)的代碼頁1252(即CP1252),以及實現了GBK的代碼頁936(即CP936)。

3.

代碼頁可以在從字元映射單位元組值或多位元組值表格中表現。注意,這裡的單位元組值與多位元組值指的是特定於系統平台的物理意義上的位元組序列,不是指與系統平台無關的邏輯意義上的碼元序列。正因為這樣,代碼頁也被稱之內碼錶。

也就是說,代碼頁是字符集的具體實現,可以將其理解為一張「字元-位元組映射表,通過查表實現「字元-位元組」的翻譯。

代碼頁主要用於字元在計算機中的存儲顯示,比如,計算機讀取了一個二進位位元組,那這個位元組到底代表哪個字元,就需要到指定的代碼頁中查找,這個查找的過程就被稱為查表

4.

代碼頁的指定在Windows中是系統默認設置的(即默認系統區域設置),也可在(Windows7的)「控制面板-區域和語言-管理-非Unicode程序的語言-更改系統區域設置」中選擇列表中的語言進行更改。

注意:系統區域設置System Locale可用於確定在不使用Unicode編碼的程序中輸入和顯示信息的默認字符集和字體,這樣就可以讓非Unicode程序在計算機上使用指定的語言得以正常運行。因此,在計算機上安裝某些非Unicode程序時,可能需要更改默認的系統區域設置。為系統區域設置選擇不同的語言並不會影響Windows系統本身或其他使用Unicode編碼的程序的菜單和對話框中的語言顯示。

(笨笨阿林原創文章,轉載請註明出處)

5.

早期在IBM和微軟內部使用數字來標記不同的字符集,不同的廠商對同一個字符集使用各自不同的名稱。

例如,UTF-8在IBM稱作代碼頁1208,在微軟稱作代碼頁65001,在SAP稱作代碼頁4110;Windows使用936代碼頁(Code Page 936,即CP936)、Mac系統使用EUC-CN代碼頁實現GBK字符集的編碼(EUC:Extended Unix Code;EUC-CN是類Unix系統中GBK編碼方案的別名,等同於Windows下的cp936代碼頁),名字雖然不一樣,但對於同一漢字的編碼肯定是一樣的。

三、微軟Windows操作系統中ANSI代碼頁的設置

1.

微軟為了適應世界上不同地區用戶的文化背景和生活習慣,在Windows中設計了區域(Locale)設置的功能。

Locale是指特定於某個國家或地區的一組設定,包括代碼頁,以及數字、貨幣、時間和日期的格式等。

在Windows內部,其實有兩個Locale設置:系統Locale和用戶Locale。系統Locale決定代碼頁,用戶Locale決定數字、貨幣、時間和日期的格式。

可以在Windows控制面板的「區域和語言選項」中設置系統Locale(非Unicode程序的語言)和用戶Locale(標準和格式):

(Windows XP中的Locale設置)

(Windows 7中的Locale設置)

2.

系統Locale對應的代碼頁被作為Windows的默認代碼頁。在沒有明確指定某個文本的編碼信息時,Windows將按照指定的默認代碼頁的編碼方案來解釋該文本數據。這個默認代碼頁通常被稱作ANSI代碼頁(ACP)。

在歷史上,IBM的個人計算機和微軟公司的操作系統曾經是PC的標準配置。微軟公司將IBM公司定義的代碼頁稱作OEM代碼頁,在IBM公司的代碼頁基礎上作了些增補後,稱為ANSI代碼頁。

在Windows XP的「區域和語言選項」高級頁面的「代碼頁轉換表」中可看到各個語種的代碼頁(Windows7中已經不能直接看到了)。例如:

·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 -越南)

(笨笨阿林原創文章,轉載請註明出處)

預告:下一篇將開始正式講解Unicode編碼方案,敬請關注!】

上一篇:刨根究底字元編碼之六--簡體漢字編碼中區位碼、國標碼、內碼、外碼、字形碼的區別及關係 - 知乎專欄

下一篇:刨根究底字元編碼之八--Unicode編碼方案概述 - 知乎專欄

推薦閱讀:

tomcat伺服器8.0版本對於request發出的請求是否默認按照utf-8編碼而不是之前的iso8859-1?
給在美國的外國人發郵件,郵件中出現的漢字能正常顯示嗎?
Microsoft開發記事本的團隊,是不是使用了一個非常弱智的行為來保存UTF-8編碼的文件?
字元編碼(一)|編碼基本說明

TAG:字符编码 | 字符集 | Unicode统一码 |