刨根究底字元編碼之一——關鍵術語解釋(上)

聲明:本系列文章參考了網上的大量資料,除了少部分資料由於未作大量修改(但基本也有少量修改,因為網上文章隨意性較大,如若不改反而讓人迷糊)而標明了出處之外,其餘由於已作了大量改寫,因此沒有再一一說明,在此對原作者表示歉意並感謝。另外,文中圖片部分來自網路,部分為本人製作,也不再一一說明。同時,文中若有錯漏,還請直接招呼板磚,不用客氣。

關鍵術語解釋(上)

一、位

1.

即比特(Bit),亦稱二進位位、比特位、位元、位,指二進位數中的一位,是計算機中信息表示的最小單位。

Bit是Binary digit(二進位數位)的縮寫,由數學家John Wilder Tukey提出,習慣上以小寫字母b表示,如8比特可表示為8b。

2.

每個比特有0和1兩個可能的值,除了代表數值本身之外,還可代表:

  • 數值的正、負;
  • 兩種狀態,如電燈的開、關,某根導線上電壓的有、無,等等;
  • 抽象邏輯上的是、否。

二、位元組

1.

在計算機中,通常都會使用一連串的位(比特),稱之為位串(bit string比特串)。很顯然,計算機系統都不會讓你使用任意長度的位串,而是使用某個特定長度的位串。

一些常見的位串長度形式具有約定好的名稱,如,半位元組(nibble,貌似用的不多)代表四個位的組合,位元組(byte)代表8個位的組合;還有字(word)、雙字(Double word,簡寫為Dword)、四字(Quad word,簡寫為Qword)、十位元組(Ten byte,簡寫為Tbyte)。

2.

位元組(byte),又稱為位元組,音譯為「拜特」(但很少使用這個譯名),是計算機中計量存儲容量和傳輸容量的一種基本計量單位,是由連續的、固定數量的位(即比特)所組成的位串(即比特串),一般由8個位組成,即1 byte = 8 bit。習慣上用大寫的B表示,如3位元組可表示為3B。

現代個人計算機(PC)的存儲器編址,一般是以位元組為單位的,稱之為按位元組編址,因此位元組一般也是存儲器的最小存取單元以及處理器的最小定址單位(也有按位定址、按字定址等等,但在個人計算機上應用不普遍,這裡不討論)。

3.

位元組作為存儲器的最小存取單元以及處理器的最小定址單位這一重要特點,跟字元編碼的關係極為密切(比如,碼元的單位元組與多位元組、位元組序的大端序與小端序等,都與以位元組為基礎的基本數據類型密切相關,詳見後文介紹)。

4.

習慣上,按照下面的圖來排列一個位元組上的各個位的順序,即按照從右到左的順序,依次為最低位(第0位)到最高位(第7位):

5.

注意,位元組不一定非得是8位,以前也有過4位、6位或7位作為一個位元組的標準,比如IBM 701(36位字長,18位為一位元組)、IBM 702(7位字長,7位為一位元組)、CDC 6600(60位字長,12位為一位元組byte)等,只是現代計算機的事實標準就是用8位來代表一個位元組(最終形成這一事實標準除了歷史原因和商業原因之外,最重要的原因應該是由於二進位的特性:2的次方計算更方便快捷)。

正是因為這個原因,在很多較為嚴謹的技術規格文獻中,為了避免產生歧義,更傾向於使用8位組(Octet)而不是位元組(Byte)這個術語來強調8比特位串。

不過,由於大眾基本上都將位元組理解為8比特位的8位組,因此一般文章中如果未作特別說明,基本上都將8位組直接稱之為位元組。

三、字與字長

1.

雖然位元組是大多數現代計算機的最小存儲單元和傳輸單元,但並不代表它是計算機可以最高效地處理的數據單位。

一般來說,計算機可以最高效地處理的數據大小,應該與其字的字長相同,這就涉及到了字及字長的概念。

  • 字:在計算機中,一串比特位(位串、比特串)是作為一個整體來處理或運算的,這串比特位稱為一個計算機字,簡稱字。字通常分為若干個位元組(每個位元組一般是8位)。
  • 字長:即字的長度,是指計算機的每個字所包含的位數。字長決定了CPU一次操作所處理的實際比特位數量的多少。字長由CPU對外數據通路的數據匯流排寬度決定。

2.

計算機處理數據的速率,顯然和它一次能加工的位數以及進行運算的快慢有關。如果一台計算機的字長是另一台計算機的兩倍,若兩台計算機的速度相同,在相同的時間內,前者能做的工作一般是後者的兩倍。因此,字長與計算機的功能和用途有很大的關係,是計算機的一個重要技術指標。

在目前來講,桌面平台的處理器字長正處於從32位向64位過渡的時期,嵌入式設備基本穩定在32位,而在某些專業領域(如高端顯卡),處理器字長早已經達到了64位乃至更多的128位

四、字符集

1.

字符集(Character Set、Charset),字面上的理解就是字元的集合,是一個自然語言文字系統支持的所有抽象字元的集合。字元是各種文字和符號的總稱,包括文字、數字、字母、音節、標點符號、圖形符號等。

例如ASCII字符集,定義了128個字元;GB2312定義了7445個字元。而計算機系統中提到的字符集準確地來說,指的是已編號的字元的有序集合(但不一定是連續的)。

2.

常見字符集有ASCII字符集、ISO 8859系列字符集、GB系列字符集(GB2312、GBK、GB18030)、BIG5字符集、Unicode字符集等。

註:圖中所示微軟在GB2312的基礎上擴展制訂了GBK(Guo-Biao Kuozhan),然後GBK才成為「國家標準」(也有說GBK不是國家標準,只是「技術規範指導性文件」);但網上也有資料說是先有GBK(由全國信息技術標準化技術委員會1995年12月1日制訂),然後微軟才在其內部所用的CP936字碼表(Code Page 936代碼頁936,代碼頁的解釋詳見後文)中以GBK為基礎進行了擴展(即Windows系統的代碼頁CP936是GBK漢字內碼擴展規範的一個實現)。

五、編碼

編碼(Encode),是信息從一種形式或格式轉換為另一種形式或格式的過程,比如用預先規定的方法將字元(文字、數字、符號等)、圖像、聲音或其它對象轉換成規定的電脈衝信號或二進位數字。

六、解碼

編碼(Decode),為編碼的逆過程。

七、字元編碼

1.

字元編碼(Character Encoding),是把字符集中的字元按一定格式(形式、方式)編碼為某指定集合中某一對象(比如由0和1兩個數字所組成的位串模式、由0~9十個數字所組成的自然數序列、電脈衝等)的過程,亦即在字符集與指定集合兩者之間建立一個對應關係(映射關係)的過程。這是信息處理的一項基礎技術。

而在計算機科學中,通常以字符集來表達信息,以計算機為基礎的信息處理系統則利用電子元件(硬體)的不同狀態的組合來表示、存儲和處理信息。

2.

電子元件不同狀態(一般是開和關或稱為開和閉兩種狀態)的組合能代表數字系統中的數字(比如開和關代表二進位中的0和1),因此字元編碼的過程也就可以理解為將字元轉換映射為計算機可以接受的二進位數字的過程,其目的是為了便於字元在計算機中表示、存儲、處理和傳輸(包括在網路中傳輸)。

常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII碼。其中,ASCII將字母、數字和其它符號進行編號,並且在計算機中直接用7比特的二進位數字來表示這個編號。通常會額外地在最高位(即首位)再增加一個擴充的比特位「0」,以便於計算機系統剛好以1個位元組(8比特位)的方式來進行處理、存儲和傳輸。

八、字元編碼模型

1.

字元編碼模型(Character Encoding Model),是反映字元編碼系統的結構特點和各構成部分相互關係的模型框架。

2.

由於歷史的原因,早期一般認為字符集字元編碼是同義詞,並不需要進行嚴格區分。因此在像ASCII這樣的簡單字符集為代表的傳統字元編碼模型中,這兩個概念的含義幾乎是等同的。

因為在傳統字元編碼模型中,基本上都是將字符集里的字元進行編號(字元編號轉化為二進位數後一般不超過一個位元組),然後該字元編號就是字元的編碼。

但是,由統一碼(Unicode)和通用字符集(UCS)為代表的現代字元編碼模型則沒有直接採用ASCII這樣的簡單字符集的編碼思路,而是採用了一個全新的編碼思路。

3.

這個全新的編碼思路將字符集與字元編碼的概念更為細緻地分解為了以下幾個方面:

  • 有哪些字元;
  • 這些字元的編號是什麼;
  • 這些編號如何編碼成一系列邏輯層面有限大小的數字,即碼元序列;
  • 這些邏輯層面的碼元序列如何轉換為(映射為)物理層面的位元組流(位元組序列);
  • 在某些特殊的傳輸環境中(比如Email),再進一步將位元組序列進行適應性編碼處理。

這幾個方面作為一個整體,於是構成了現代字元編碼模型

4.

現代字元編碼模型之所以要分解為這麼幾個方面,其核心思想是創建一個能夠用不同方式來編碼的通用字符集。注意這裡的關鍵詞:「不同方式」與「通用」。

這意味著,同一個字符集,可以通用於不同的編碼方式;也就是說,可以採用不同的編碼方式來對同一個字符集進行編碼。字符集與編碼方式之間的關係可以是一對多的關係。

更進一步而言,在傳統字元編碼模型中,字元編碼方式與字符集是緊密結合在一起的;而在現代字元編碼模型中,字元編碼方式與字符集脫鉤了。用軟體工程的專業術語來說,就是將之前緊密耦合在一起的字元編碼方式與字符集解耦了。

因此,為了正確地表示這個現代字元編碼模型,需要採用更多比「字符集」和「字元編碼」更為精確的概念術語來描述。

5.

Unicode Technical Report (UTR統一碼技術報告) #17《UNICODE CHARACTER ENCODING MODEL》中,現代字元編碼模型分為了5個層次,並引入了更多的概念術語來描述(下面所涉及到的一些全新的概念術語,這裡只做簡介,暫時不作解釋,但後文會陸續進行詳細解釋):

  • 第1層 抽象字元表ACR(Abstract Character Repertoire抽象字元清單):明確字元的範圍(即確定支持哪些字元)
  • 第2層 編號字符集CCS(Coded Character Set):用數字編號表示字元(即用數字給抽象字元表ACR中的字元進行編號)
  • 第3層 字元編碼方式CEF(Character Encoding Form字元編碼形式、字元編碼格式、字元編碼規則):將字元編號編碼為邏輯上的碼元序列(即邏輯字元編碼)
  • 第4層 字元編碼模式CES(Character Encoding Scheme):將邏輯上的碼元序列映射為物理上的位元組序列(即物理字元編碼)
  • 第5層 傳輸編碼語法TES(Transfer Encoding Syntax):將位元組序列作進一步的適應性編碼處理

後面將分層予以簡要介紹。

上一篇:刨根究底字元編碼之零--前言 - 知乎專欄

下一篇:刨根究底字元編碼之二--關鍵術語解釋(下) - 知乎專欄

推薦閱讀:

如何向非技術人員解釋 Unicode 是什麼?
刨根究底字元編碼之三——字元編碼的由來

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