刨根究底字符編碼之一——關(guān)鍵術(shù)語(yǔ)解釋(上)



<i>聲明:本系列文章參考了網(wǎng)上的大量資料,除了少部分資料由于未作大量修改(但基本也有少量修改,因?yàn)榫W(wǎng)上文章隨意性較大,如若不改反而讓人迷糊)而標(biāo)明了出處之外,其余由于已作了大量改寫,因此沒有再一一說(shuō)明,在此對(duì)原作者表示歉意并感謝。另外,文中圖片部分來(lái)自網(wǎng)絡(luò),部分為本人制作,也不再一一說(shuō)明。同時(shí),文中若有錯(cuò)漏,還請(qǐng)直接招呼板磚,不用客氣。</i>

關(guān)鍵術(shù)語(yǔ)解釋(上)

一、位

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

Bit是Binary digit(二進(jìn)制數(shù)位)的縮寫,由數(shù)學(xué)家John Wilder Tukey提出,習(xí)慣上以小寫字母b表示,如8比特可表示為8b。

每個(gè)位有0和1兩個(gè)可能的值,可代表:

  • 數(shù)值的正、負(fù);
  • 兩種狀態(tài),如電燈的開、關(guān),某根導(dǎo)線上電壓的有、無(wú),等等;
  • 抽象邏輯上的是、否。

二、字節(jié)

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

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


字節(jié)(byte),又稱為位元組,音譯為“拜特”(但很少使用這個(gè)譯名),是計(jì)算機(jī)中計(jì)量存儲(chǔ)容量和傳輸容量的一種基本計(jì)量單位,是由連續(xù)的、固定數(shù)量的位(即比特)所組成的位串(即比特串),一般由8個(gè)位組成,即1 byte = 8 bit。習(xí)慣上用大寫的B表示,如3字節(jié)可表示為3B。

現(xiàn)代個(gè)人計(jì)算機(jī)(PC)的存儲(chǔ)器編址,一般是以字節(jié)為單位的,稱之為按字節(jié)編址,因此字節(jié)一般也是存儲(chǔ)器的最小存取單元以及處理器的最小尋址單位(也有按位尋址、按字尋址等等,但在個(gè)人計(jì)算機(jī)上應(yīng)用不普遍,這里不討論)。

字節(jié)作為存儲(chǔ)器的最小存取單元以及處理器的最小尋址單位這一重要特點(diǎn),跟字符編碼的關(guān)系極為密切(比如,碼元的單字節(jié)與多字節(jié)、字節(jié)序的大端序與小端序等,都與以字節(jié)為基礎(chǔ)的基本數(shù)據(jù)類型密切相關(guān),詳見后文介紹)。

習(xí)慣上,按照下面的圖來(lái)排列一個(gè)字節(jié)上的各個(gè)位的順序,即按照從右到左的順序,依次為最低位(第0位)到最高位(第7位):

注意,字節(jié)不一定非得是8位,以前也有過(guò)4位、6位或7位作為一個(gè)字節(jié)的標(biāo)準(zhǔn),比如IBM 701(36位字長(zhǎng),18位為一字節(jié))、IBM 702(7位字長(zhǎng),7位為一字節(jié))、CDC 6600(60位字長(zhǎng),12位為一字節(jié)byte)等,只是現(xiàn)代計(jì)算機(jī)的事實(shí)標(biāo)準(zhǔn)就是用8位來(lái)代表一個(gè)字節(jié)(最終形成這一事實(shí)標(biāo)準(zhǔn)除了歷史原因和商業(yè)原因之外,最重要的原因應(yīng)該是由于二進(jìn)制的特性:2的次方計(jì)算更方便快捷)。

正是因?yàn)檫@個(gè)原因,在很多較為嚴(yán)謹(jǐn)?shù)募夹g(shù)規(guī)格文獻(xiàn)中,為了避免產(chǎn)生歧義,更傾向于使用8位組(Octet)而不是字節(jié)(Byte)這個(gè)術(shù)語(yǔ)來(lái)強(qiáng)調(diào)8比特位串。不過(guò),由于大眾基本上都將字節(jié)理解為8比特位的8位組,因此一般文章中如果未作特別說(shuō)明,基本上都將8位組直接稱之為字節(jié)。

三、字與字長(zhǎng)

雖然字節(jié)是大多數(shù)現(xiàn)代計(jì)算機(jī)的最小存儲(chǔ)單元和傳輸單元,但并不代表它是計(jì)算機(jī)可以最高效地處理的數(shù)據(jù)單位。

一般來(lái)說(shuō),計(jì)算機(jī)可以最高效地處理的數(shù)據(jù)大小,應(yīng)該與其字的字長(zhǎng)相同,這就涉及到了字及字長(zhǎng)的概念。

  • 字(Word):在計(jì)算機(jī)中,一串比特位(位串、比特串)是作為一個(gè)整體來(lái)處理或運(yùn)算的,這串比特位稱為一個(gè)計(jì)算機(jī)字,簡(jiǎn)稱字。字通常分為若干個(gè)字節(jié)(每個(gè)字節(jié)一般是8位)。

  • 字長(zhǎng)(Word Length):即字的長(zhǎng)度,是指計(jì)算機(jī)的每個(gè)字所包含的位數(shù)。字長(zhǎng)決定了CPU一次操作所處理的實(shí)際比特位數(shù)量的多少。字長(zhǎng)由CPU對(duì)外數(shù)據(jù)通路的數(shù)據(jù)總線寬度決定。

計(jì)算機(jī)處理數(shù)據(jù)的速率,顯然和它一次能加工的位數(shù)以及進(jìn)行運(yùn)算的快慢有關(guān)。如果一臺(tái)計(jì)算機(jī)的字長(zhǎng)是另一臺(tái)計(jì)算機(jī)的兩倍,若兩臺(tái)計(jì)算機(jī)的速度相同,在相同的時(shí)間內(nèi),前者能做的工作一般是后者的兩倍。因此,字長(zhǎng)與計(jì)算機(jī)的功能和用途有很大的關(guān)系,是計(jì)算機(jī)的一個(gè)重要技術(shù)指標(biāo)。

在目前來(lái)講,桌面平臺(tái)的處理器字長(zhǎng)正處于從32位向64位過(guò)渡的時(shí)期,嵌入式設(shè)備基本穩(wěn)定在32位,而在某些專業(yè)領(lǐng)域(如高端顯卡),處理器字長(zhǎng)早已經(jīng)達(dá)到了64位乃至更多的128位

四、字符集

字符集(Character Set、Charset),字面上的理解就是字符的集合,是一個(gè)自然語(yǔ)言文字系統(tǒng)支持的所有抽象字符的集合。字符是各種文字和符號(hào)的總稱,包括各個(gè)國(guó)家的文字、數(shù)字、字母、音節(jié)、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)等。

例如ASCII字符集,定義了128個(gè)字符;GB2312定義了7445個(gè)字符。而計(jì)算機(jī)系統(tǒng)中提到的字符集準(zhǔn)確地來(lái)說(shuō),指的是已編號(hào)的字符的有序集合(但不一定是連續(xù)的)。

常見字符集有ASCII字符集、GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集、Unicode字符集等。

<b>注:</b>圖中所示微軟在GB2312的基礎(chǔ)上擴(kuò)展制訂了GBK(Guo-Biao Kuozhan),然后GBK才成為“國(guó)家標(biāo)準(zhǔn)”(也有說(shuō)GBK不是國(guó)家標(biāo)準(zhǔn),只是“技術(shù)規(guī)范指導(dǎo)性文件”);但網(wǎng)上也有資料說(shuō)是先有GBK(由全國(guó)信息技術(shù)標(biāo)準(zhǔn)化技術(shù)委員會(huì)1995年12月1日制訂),然后微軟才在其內(nèi)部所用的CP936字碼表(Code Page 936代碼頁(yè)936,代碼頁(yè)的解釋詳見后文)中以GBK為基礎(chǔ)進(jìn)行了擴(kuò)展(即Windows系統(tǒng)的代碼頁(yè)CP936是GBK漢字內(nèi)碼擴(kuò)展規(guī)范的一個(gè)實(shí)現(xiàn))。

五、編碼

編碼(Encode),是信息從一種形式或格式轉(zhuǎn)換為另一種形式或格式的過(guò)程,比如用預(yù)先規(guī)定的方法將字符(文字、數(shù)字、符號(hào)等)、圖像、聲音或其它對(duì)象轉(zhuǎn)換成規(guī)定的電脈沖信號(hào)或二進(jìn)制數(shù)字。

六、解碼

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

encode decode.jpg

七、字符編碼

字符編碼(Character Encoding),是把字符集中的字符按一定格式(形式、方式)編碼為某指定集合中某一對(duì)象(比如由0和1兩個(gè)數(shù)字所組成的位串模式、由0~9十個(gè)數(shù)字所組成的自然數(shù)序列、電脈沖等)的過(guò)程,亦即在字符集與指定集合兩者之間建立一個(gè)對(duì)應(yīng)關(guān)系(映射關(guān)系)的過(guò)程。這是信息處理的一項(xiàng)基礎(chǔ)技術(shù)。

而在計(jì)算機(jī)科學(xué)中,通常以字符集來(lái)表達(dá)信息,以計(jì)算機(jī)為基礎(chǔ)的信息處理系統(tǒng)則利用電子元件(硬件)的不同狀態(tài)的組合來(lái)表示、存儲(chǔ)和處理信息。

電子元件不同狀態(tài)(一般是開和關(guān)或稱為開和閉兩種狀態(tài))的組合能代表數(shù)字系統(tǒng)中的數(shù)字(比如開和關(guān)代表二進(jìn)制中的0和1),因此字符編碼的過(guò)程也就可以理解為將字符轉(zhuǎn)換映射為計(jì)算機(jī)可以接受的二進(jìn)制數(shù)字的過(guò)程,其目的是為了便于字符在計(jì)算機(jī)中表示、存儲(chǔ)、處理和傳輸(包括在網(wǎng)絡(luò)中傳輸)。

常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII碼。其中,ASCII將字母、數(shù)字和其它符號(hào)進(jìn)行編號(hào),并且在計(jì)算機(jī)中直接用7比特的二進(jìn)制數(shù)字來(lái)表示這個(gè)編號(hào)。通常會(huì)額外地在最高位(即首位)再增加一個(gè)擴(kuò)充的比特位“0”,以便于計(jì)算機(jī)系統(tǒng)剛好以1個(gè)字節(jié)(8比特位)的方式來(lái)進(jìn)行處理、存儲(chǔ)和傳輸。

character-encodings-byte-array-to-string-java.gif

八、字符編碼模型

字符編碼模型(Character Encoding Model),是反映字符編碼系統(tǒng)的結(jié)構(gòu)特點(diǎn)和各構(gòu)成部分相互關(guān)系的模型框架。

由于歷史的原因,早期一般認(rèn)為字符集字符編碼是同義詞,并不需要進(jìn)行嚴(yán)格區(qū)分。因此在像ASCII這樣的簡(jiǎn)單字符集為代表的傳統(tǒng)字符編碼模型中,這兩個(gè)概念的含義幾乎是等同的。

因?yàn)樵趥鹘y(tǒng)字符編碼模型中,基本上都是將字符集里的字符進(jìn)行編號(hào)(字符編號(hào)轉(zhuǎn)化為二進(jìn)制數(shù)后一般不超過(guò)一個(gè)字節(jié)),然后該字符編號(hào)就是字符的編碼。

但是,由統(tǒng)一碼(Unicode)和通用字符集(UCS)為代表的現(xiàn)代字符編碼模型則沒有直接采用ASCII這樣的簡(jiǎn)單字符集的編碼思路,而是采用了一個(gè)全新的編碼思路。

這個(gè)全新的編碼思路將字符集與字符編碼的概念更為細(xì)致地分解為了以下幾個(gè)方面:

  • 有哪些字符;
  • 這些字符的編號(hào)是什么;
  • 這些編號(hào)如何編碼成一系列邏輯層面有限大小的數(shù)字,即碼元序列;
  • 以及這些邏輯層面的碼元序列如何轉(zhuǎn)換為(映射為)物理層面的字節(jié)流(字節(jié)序列);
  • 在某些特殊的傳輸環(huán)境中(比如Email),再進(jìn)一步將字節(jié)序列進(jìn)行適應(yīng)性編碼處理。

這幾個(gè)方面作為一個(gè)整體,于是構(gòu)成了現(xiàn)代字符編碼模型

之所以要分解為這么幾個(gè)方面,其核心思想是創(chuàng)建一個(gè)能夠用不同方式來(lái)編碼的通用字符集。注意這里的關(guān)鍵詞:“不同方式”與“通用”。

這意味著,在傳統(tǒng)字符編碼模型中,字符編碼方式與字符集是緊密結(jié)合在一起的,而在現(xiàn)代字符編碼模型中,字符編碼方式與字符集脫鉤了。用軟件工程的專業(yè)術(shù)語(yǔ)來(lái)說(shuō),就是將之前緊密耦合在一起的字符編碼方式與字符集解耦了。

因此,為了正確地表示這個(gè)現(xiàn)代字符編碼模型,還需要更多比“字符集”和“字符編碼”更為精確的術(shù)語(yǔ)來(lái)描述。

Unicode Technical Report (UTR統(tǒng)一碼技術(shù)報(bào)告) #17《UNICODE CHARACTER ENCODING MODEL》中,現(xiàn)代字符編碼模型分為5個(gè)層次(下面會(huì)涉及到一些全新的概念,由于這里只是簡(jiǎn)介,暫時(shí)不作解釋,但后文會(huì)陸續(xù)進(jìn)行詳細(xì)解釋):

  • 第1層?抽象字符表ACR(Abstract Character Repertoire抽象字符清單):明確字符的范圍(即確定支持哪些字符)

  • 第2層 ?編號(hào)字符集CCS(Coded Character Set):用數(shù)字編號(hào)表示字符(即用數(shù)字給抽象字符表ACR中的字符編號(hào))

  • 第3層?字符編碼方式CEF(Character Encoding Form字符編碼形式、字符編碼格式、字符編碼規(guī)則):將字符編號(hào)(即碼點(diǎn)值)編碼為碼元序列(即字符編碼)

  • 第4層?字符編碼模式CES(Character Encoding Scheme):將邏輯上的碼元序列映射為物理上的字節(jié)序列

  • 第5層?傳輸編碼語(yǔ)法TES(Ttransfer Encoding Syntax):將字節(jié)序列作進(jìn)一步的適應(yīng)性編碼處理

后面將分層予以簡(jiǎn)要介紹。

上一篇:刨根究底字符編碼之零——前言
下一篇:刨根究底字符編碼之二——關(guān)鍵術(shù)語(yǔ)解釋(下)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容