聲明:本系列文章參考了網上的大量資料,除了少部分資料因爲未做大量修改(但基本上也有少許修改,由於網上文章隨意性較大,不少明顯的筆誤或先後矛盾之處,如若不改反而讓人迷糊)而標明瞭原做者和出處以外,其他因爲基本上已按本身的理解做了大量改寫,所以沒有再一一予以說明,在此對原做者表示歉意並感謝。另外,文中圖片部分來自網絡,部分爲本人制做,也再也不一一說明。同時,文中如有錯漏,還請直接招呼板磚,不用客氣。git
1、位web
1.網絡
即比特(Bit),亦稱二進制位、比特位、位元、位,指二進制數中的一位,是計算機中信息表示的最小單位。框架
Bit是Binary digit(二進制數位)的縮寫,由數學家John Wilder Tukey提出,習慣上以小寫字母b表示,如8比特可表示爲8b。編碼
2.spa
每一個比特有0和1兩個可能的值,除了表明數值自己以外,還可表明:code
2、字節orm
1.對象
在計算機中,一般都會使用一連串的位(比特),稱之爲位串(bit string比特串)。很顯然,計算機系統都不會讓你使用任意長度的位串,而是使用某個特定長度的位串。blog
一些常見的位串長度形式具備約定好的名稱,如,半字節(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位組直接稱之爲字節。
3、字與字長
一、
雖然字節是大多數現代計算機的最小存儲單元和傳輸單元,但並不表明它是計算機能夠最高效地處理的數據單位。
通常來講,計算機能夠最高效地處理的數據大小,應該與其字的字長相同,這就涉及到了字及字長的概念。
字(Word):在計算機中,一串比特位(位串、比特串)是做爲一個總體來處理或運算的,這串比特位稱爲一個計算機字,簡稱字。字一般分爲若干個字節(每一個字節通常是8位)。
字長(Word Length):即字的長度,是指計算機的每一個字所包含的位數。字長決定了CPU一次操做所處理的實際比特位數量的多少。字長由CPU對外數據通路的數據總線寬度決定。
2.
計算機處理數據的速率,顯然和它一次能加工的位數以及進行運算的快慢有關。若是一臺計算機的字長是另外一臺計算機的兩倍,若兩臺計算機的速度相同,在相同的時間內,前者能作的工做通常是後者的兩倍。所以,字長與計算機的功能和用途有很大的關係,是計算機的一個重要技術指標。
在目前來說,桌面平臺的處理器字長正處於從32位向64位過渡的時期,嵌入式設備基本穩定在32位,而在某些專業領域(如高端顯卡),處理器字長早已經達到了64位乃至更多的128位
4、字符集
1.
字符集(Character Set、Charset),字面上的理解就是字符的集合,是一個天然語言文字系統支持的全部抽象字符的集合。字符是各類文字和符號的總稱,包括文字、數字、字母、音節、標點符號、圖形符號等。
例如ASCII字符集,定義了128個字符;GB2312定義了7445個字符。而計算機系統中提到的字符集準確地來講,指的是已編號的字符的有序集合(但不必定是連續的)。
2.
常見字符集有ASCII字符集、ISO 8859系列字符集、GB系列字符集(GB23十二、GBK、GB18030)、BIG5字符集、Unicode字符集等。
注:圖中所示微軟在GB2312的基礎上擴展制訂了GBK(Guo-Biao Kuozhan),而後GBK才成爲「國家標準」(也有說GBK不是國家標準,只是「技術規範指導性文件」);但網上也有資料說是先有GBK(由全國信息技術標準化技術委員會1995年12月1日製訂),而後微軟纔在其內部所用的CP936字碼表(Code Page 936代碼頁936,代碼頁的解釋詳見後文)中以GBK爲基礎進行了擴展(即Windows系統的代碼頁CP936是GBK漢字內碼擴展規範的一個實現)。
5、編碼
編碼(Encode),是信息從一種形式或格式轉換爲另外一種形式或格式的過程,好比用預先規定的方法將字符(文字、數字、符號等)、圖像、聲音或其它對象轉換成規定的電脈衝信號或二進制數字。
6、解碼
解碼(Decode),爲編碼的逆過程。
7、字符編碼
1.
字符編碼(Character Encoding),是把字符集中的字符按必定格式(形式、方式)編碼爲某指定集合中某一對象(好比由0和1兩個數字所組成的位串模式、由0~9十個數字所組成的天然數序列、電脈衝等)的過程,亦即在字符集與指定集合二者之間創建一個對應關係(映射關係)的過程。這是信息處理的一項基礎技術。
而在計算機科學中,一般以字符集來表達信息,以計算機爲基礎的信息處理系統則利用電子元件(硬件)的不一樣狀態的組合來表示、存儲和處理信息。
2.
電子元件不一樣狀態(通常是開和關或稱爲開和閉兩種狀態)的組合能表明數字系統中的數字(好比開和關表明二進制中的0和1),所以字符編碼的過程也就能夠理解爲將字符轉換映射爲計算機能夠接受的二進制數字的過程,其目的是爲了便於字符在計算機中表示、存儲、處理和傳輸(包括在網絡中傳輸)。
常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII碼。其中,ASCII將字母、數字和其它符號進行編號,而且在計算機中直接用7比特的二進制數字來表示這個編號。一般會額外地在最高位(即首位)再增長一個擴充的比特位「0」,以便於計算機系統恰好以1個字節(8比特位)的方式來進行處理、存儲和傳輸。
8、字符編碼模型
1.
字符編碼模型(Character Encoding Model),是反映字符編碼系統的結構特色和各構成部分相互關係的模型框架。
2.
因爲歷史的緣由,早期通常認爲字符集和字符編碼是同義詞,並不須要進行嚴格區分。所以在像ASCII這樣的簡單字符集爲表明的傳統字符編碼模型中,這兩個概念的含義幾乎是等同的。
由於在傳統字符編碼模型中,基本上都是將字符集裏的字符進行編號(字符編號轉化爲二進制數後通常不超過一個字節),而後該字符編號就是字符的編碼。
可是,由統一碼(Unicode)和通用字符集(UCS)爲表明的現代字符編碼模型則沒有直接採用ASCII這樣的簡單字符集的編碼思路,而是採用了一個全新的編碼思路。
3.
這個全新的編碼思路將字符集與字符編碼的概念更爲細緻地分解爲了如下幾個方面:
1)有哪些字符;
2)這些字符的編號是什麼;
3)這些編號如何編碼成一系列邏輯層面有限大小的數字,即碼元序列;
4)這些邏輯層面的碼元序列如何轉換爲(映射爲)物理層面的字節流(字節序列);
5)在某些特殊的傳輸環境中(好比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):將字節序列做進一步的適應性編碼處理
後面將分層予以介紹。