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

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

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

1.

抽象字符表ACR是一個(gè)編碼系統(tǒng)支持的所有抽象字符的集合,可以簡(jiǎn)單理解為無(wú)序的字符集合,用于確定字符的范圍,即要支持哪些字符。

抽象字符表ACR的一個(gè)重要特點(diǎn)是字符的無(wú)序性,即其中的字符并沒有編排數(shù)字順序,當(dāng)然也就沒有數(shù)字編號(hào)。

2.

抽象”字符不具有某種特定的字形,不應(yīng)與具有某種特定字形的“具體”字符混淆。

3.

字符表可以是封閉的(即字符范圍是固定的),即除非創(chuàng)建一個(gè)新的標(biāo)準(zhǔn)(ASCII字符表和多數(shù)ISO/IEC 8859系列都是這樣的例子),否則不允許添加新的符號(hào);字符表也可以是開放的(即字符范圍是不固定的),即允許不斷添加新的符號(hào)(Unicode字符表和一定程度上Code Page代碼頁(yè)是這方面的例子)。

二、第2層 ?編號(hào)字符集CCS(Coded Character Set):用數(shù)字編號(hào)表示字符(即用數(shù)字給字符編號(hào))

【注:一般將“Coded Character Set”翻譯為“編碼字符集”或“已編碼字符集”,但這里的“編碼”二字容易導(dǎo)致與后文的“編碼方式”及“編碼模式中的“編碼”二字混淆,帶來(lái)理解上的困擾,因此覺得翻譯為“編號(hào)字符集”為宜。

1.

前面講了,抽象字符表里的字符是沒有編排順序的,但無(wú)序的抽象字符表只能判斷某個(gè)字符是否屬于某個(gè)字符表,卻無(wú)法方便地引用、指稱該字符表中的某個(gè)特定字符。

為了更方便地引用、指稱字符表中的字符,就必須為抽象字符表中的每個(gè)字符進(jìn)行編號(hào)。

所謂字符編號(hào),就是將抽象字符表ACR中的中每個(gè)抽象字符(簡(jiǎn)稱字符)表示為1個(gè)非負(fù)整數(shù)N或者映射到1個(gè)坐標(biāo)(非負(fù)整數(shù)值對(duì)x, y),也就是將抽象字符的集合映射一個(gè)非負(fù)整數(shù)或非負(fù)整數(shù)值對(duì)的集合,映射的結(jié)果就是編號(hào)字符集CCS。因此,字符的編號(hào)也就是字符的非負(fù)整數(shù)代碼。

例如,在一個(gè)給定的抽象字符表中,表示大寫拉丁字母“A”的字符被賦予非負(fù)整數(shù)65、字符“B”是66,如此繼續(xù)下去。

2.

由此產(chǎn)生了編號(hào)空間(Code Space,一般翻譯為代碼空間、碼空間、碼點(diǎn)空間)的概念:根據(jù)抽象字符表中抽象字符的數(shù)目,可以設(shè)定一個(gè)字符編號(hào)的上限值(該上限值往往設(shè)定為大于抽象字符表中的字符總數(shù)),從0到該上限值之間的非負(fù)整數(shù)范圍就稱之為編號(hào)空間。

編號(hào)空間的描述:

1)可以用一對(duì)非負(fù)整數(shù)來(lái)描述,例如:GB2312的漢字編號(hào)空間是94 x 94;

2)也可以用一個(gè)非負(fù)整數(shù)來(lái)描述,例如:ISO-8859-1的編號(hào)空間是256;也可以用字符的存儲(chǔ)單元尺寸來(lái)描述,例如:ISO-8859-1是一個(gè)8比特的編號(hào)空間(2^8=256);

3)還可以用其子集來(lái)描述,如行、列、面(Plane平面、層面)等等。

3.

編號(hào)空間中的一個(gè)位置(Position)稱為碼點(diǎn)(Code Point代碼點(diǎn))碼位(Code Position代碼位)。一個(gè)字符占用的碼點(diǎn)所在的坐標(biāo)(非負(fù)整數(shù)值對(duì))或所代表的非負(fù)整數(shù),就是該字符的編號(hào),又稱之為碼點(diǎn)值(即碼點(diǎn)編號(hào))。

不過,嚴(yán)格來(lái)講,字符編號(hào)并不完全等同于碼點(diǎn)編號(hào)(即碼點(diǎn)值)。因?yàn)槭聦?shí)上,由于某些特殊的原因,編號(hào)字符集CSS里的碼點(diǎn)數(shù)量要大于抽象字符表ACR中的字符數(shù)量。

在編號(hào)字符集中,除了字符碼點(diǎn)之外,還存在著非字符碼點(diǎn)和保留碼點(diǎn),所以字符編號(hào)不如碼點(diǎn)編號(hào)準(zhǔn)確;但若對(duì)字符碼點(diǎn)的碼點(diǎn)編號(hào)稱之為字符編號(hào),倒也更為直接。

字符碼點(diǎn)又稱之為Unicode標(biāo)量值(Unicode Scalar Value,感覺不如字符碼點(diǎn)更為直觀),非字符碼點(diǎn)和保留碼點(diǎn)詳見后文介紹。

4.

注意,經(jīng)常直接以“碼點(diǎn)”指代“碼點(diǎn)值”——當(dāng)說到“碼點(diǎn)”的時(shí)候,有可能是在說編號(hào)空間(即碼點(diǎn)空間)中的一個(gè)位置,即碼點(diǎn);也有可能實(shí)際是在說某個(gè)碼點(diǎn)的碼點(diǎn)值,即碼點(diǎn)編號(hào)。具體根據(jù)上下文而定。

這種類似的指代非常普遍,又比如“字符集”、“字符編號(hào)”和“字符編碼”這三個(gè)概念就經(jīng)常相互指代。以“碼點(diǎn)”指代“碼點(diǎn)值”,根據(jù)上下文,倒也還不難理解;但“字符集”、“字符編號(hào)”和“字符編碼”三者也經(jīng)常相互指代,雖然有其歷史原因,但目前的實(shí)際情況所導(dǎo)致的結(jié)果卻是使人迷惑、讓人抓狂!

5.

因此,所謂編號(hào)字符集,可簡(jiǎn)單理解為就是把抽象字符一一進(jìn)行編號(hào)或者說一一映射為碼點(diǎn)值(即碼點(diǎn)編號(hào))后所得到的結(jié)果。編號(hào)字符集CSS常簡(jiǎn)稱為字符集。

注意不要將編號(hào)字符集CSS和抽象字符表ACR相混淆。多個(gè)不同的編號(hào)字符集CCS可以表示同一個(gè)抽象字符表ACR。

6.

在Unicode標(biāo)準(zhǔn)中,一個(gè)單個(gè)的抽象字符,既有可能與多個(gè)碼點(diǎn)對(duì)應(yīng)(為了與其它標(biāo)準(zhǔn)兼容,比如碼點(diǎn)編號(hào)為U+51C9與U+F979的這兩個(gè)碼點(diǎn)實(shí)際上是同一個(gè)字符“涼”,這是為了兼容韓國(guó)字符集標(biāo)準(zhǔn)KS X 1001:1998,具體可參看Unicode的官方文檔),也有可能使用一個(gè)由多個(gè)碼點(diǎn)所組成的碼點(diǎn)序列表示(為了表示由基本字符與組合字符組合在一起所組成的字符,比如a?,由碼點(diǎn)編號(hào)為U+0061的基本字符字母“a”和碼點(diǎn)編號(hào)為U+0300的組合字符讀音符號(hào)“?”組成);同時(shí),也并非每一個(gè)碼點(diǎn)都對(duì)應(yīng)于一個(gè)字符,也存在著非字符碼點(diǎn)或保留碼點(diǎn)。詳見后文解釋。

7.

特別注意:雖然“編號(hào)”與后文某種字符編碼方式CEF中的“編碼”(即碼元序列,解釋詳見后文)以及某種字符編碼模式CES中的“編碼”(即字節(jié)序列,解釋詳見后文)存在著對(duì)應(yīng)的關(guān)系,但“編號(hào)”“編碼”截然不同的兩個(gè)概念。

對(duì)字符編號(hào)的過程——即確定字符碼點(diǎn)值的過程,跟計(jì)算機(jī)還沒有直接關(guān)系,可認(rèn)為是一個(gè)純數(shù)學(xué)的問題,因?yàn)橹皇菍⒆址c編號(hào)(即碼點(diǎn)值、碼點(diǎn)編號(hào))對(duì)應(yīng)起來(lái);根本還沒涉及編碼算法的問題——即根據(jù)指定的字符編碼方式CEF對(duì)編號(hào)進(jìn)行編碼以形成碼元序列,以及根據(jù)指定的字符編碼模式CES對(duì)碼元序列進(jìn)一步編碼以形成字節(jié)序列。

但這兩個(gè)概念經(jīng)常被混用,實(shí)實(shí)在在是讓人困惑的源頭,這是很令人無(wú)奈與遺憾的現(xiàn)實(shí)。

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

1.

在講抽象字符表ACR時(shí)說過,不同于傳統(tǒng)的封閉的ASCII字符表,Unicode字符表是一個(gè)現(xiàn)代的開放的字符表,未來(lái)可能有更多的字符加入進(jìn)來(lái)(比如很多Emoji表情符就被源源不斷地加入進(jìn)來(lái))。因此,Unicode編號(hào)字符集所需要的碼點(diǎn)數(shù)量,必然是會(huì)不斷增加的,相對(duì)來(lái)說是無(wú)限的。

但計(jì)算機(jī)所能表示的整數(shù)范圍卻是相對(duì)有限的。比如,一個(gè)無(wú)符號(hào)單字節(jié)整型數(shù)(unsigned char, uint8)能夠表示的編號(hào)只有0~0xFF,共256個(gè);一個(gè)無(wú)符號(hào)雙字節(jié)短整型數(shù)(unsigned short, uint16)的能夠表示的編號(hào)只有0~0xFFFF,共65536個(gè);而一個(gè)無(wú)符號(hào)四字節(jié)長(zhǎng)整型數(shù)(unsigned long, uint32)能表示的碼位只有0~0xFFFFFFFF,共4294967296個(gè)。

2.

那么問題來(lái)了:

1)一方面,怎么通過相對(duì)有限的整型數(shù)來(lái)高可擴(kuò)展地、高可適應(yīng)地應(yīng)對(duì)未來(lái)相對(duì)無(wú)限增長(zhǎng)的字符數(shù)量呢?是用多個(gè)單字節(jié)整型數(shù)來(lái)間接表示,還是用一個(gè)足夠大的多字節(jié)整型數(shù)來(lái)直接表示?

2)另一方面,ASCII字符編碼作為最早出現(xiàn)、已被廣泛應(yīng)用的編碼方案,完全不兼容顯然不明智,那么是直接兼容呢,還是間接兼容呢?

這兩方面的問題需要一個(gè)綜合解決方案,這就是字符編碼方式CEF(Character Encoding Form)。

3.

字符編碼方式CEF,是將編號(hào)字符集里字符的碼點(diǎn)值(即碼點(diǎn)編號(hào)、字符編號(hào))轉(zhuǎn)換成或者說編碼成有限比特長(zhǎng)度的編碼值(即字符編碼)。該編碼值實(shí)際上是碼元(Code Unit代碼單元、編碼單元)的序列(Code Unit Sequence)。

那什么是碼元呢?為什么要引入碼元這個(gè)概念呢?字符集里的字符編號(hào)(即碼點(diǎn)值、碼點(diǎn)編號(hào))又是如何轉(zhuǎn)換為計(jì)算機(jī)中的字符編碼(即碼元序列)的呢?別急,這里先記下這個(gè)概念,不必深究,后文有詳細(xì)解釋。

4.

字符編碼方式CEF也被稱為"Storage Format"(存儲(chǔ)格式)。不過,將CEF稱之為存儲(chǔ)格式實(shí)際上并不合理,因?yàn)镃EF還只是邏輯層面上的、與特定的計(jì)算機(jī)系統(tǒng)平臺(tái)無(wú)關(guān)的編碼方式,尚未涉及到物理層面上的、與特定的計(jì)算機(jī)系統(tǒng)平臺(tái)相關(guān)的存儲(chǔ)方式(第4層才涉及到)。

在ASCII這樣傳統(tǒng)的、簡(jiǎn)單的字符編碼系統(tǒng)中,字符編號(hào)就是字符編碼,字符編號(hào)與字符編碼之間是一個(gè)直接映射關(guān)系。

而在Unicode這樣現(xiàn)代的、復(fù)雜的字符編碼系統(tǒng)中,字符編號(hào)不一定等于字符編碼,字符編號(hào)與字符編碼之間不一定是一個(gè)直接映射關(guān)系(UTF-8、UTF-16為間接映射,UTF-32為直接映射)。

UTF-8、UTF-16與UTF-32等就是Unicode字符集(即編號(hào)字符集)常用的字符編碼方式CEF。(UTF-8、UTF-16與UTF-32后文各有詳細(xì)介紹)

5.

很多文章中,將Unicode與各UTF(Unicode/UCS Transformation Format,包括UTF-8、UTF-16與UTF-32等)之間的關(guān)系表述為:Unicode為標(biāo)準(zhǔn)規(guī)范、各UTF為編碼實(shí)現(xiàn)。

不嚴(yán)格地來(lái)講,也可以勉強(qiáng)這么認(rèn)為。不過,這種表述畢竟不夠嚴(yán)謹(jǐn),而且無(wú)助于理解Unicode標(biāo)準(zhǔn)(即Unicode編碼方案、Unicode編碼系統(tǒng))、Unicode字符集與各UTF字符編碼方式之間更為深入細(xì)致的關(guān)系。

注:現(xiàn)代字符編碼模型的角度來(lái)看,Unicode標(biāo)準(zhǔn)、Unicode編碼方案Unicode編碼系統(tǒng)基本上為同義詞,是包括了抽象字符表ACR、編號(hào)字符集CCS、字符編碼方式CEF以及下面要講到的字符編碼模式CES甚至傳輸編碼語(yǔ)法TES在內(nèi)的一整套標(biāo)準(zhǔn)方案系統(tǒng),并不特指某一個(gè)層面。

四、第4層 ?字符編碼模式CES(Character Encoding Scheme):將碼元序列映射為字節(jié)序列

【注:一般將“Character Encoding Scheme”翻譯為“字符編碼方案”,但習(xí)慣上通常將某個(gè)字符編碼系統(tǒng)稱之為“字符編碼方案”,為避免引起理解上的困擾,應(yīng)譯作“字符編碼模式”為宜。

1.

也稱作"Serialization Format"(序列化格式),是將字符編號(hào)進(jìn)行編碼之后的碼元序列映射為字節(jié)序列(即字節(jié)流),以便編碼后的字符在計(jì)算機(jī)中進(jìn)行處理、存儲(chǔ)和傳輸。

如果說將編號(hào)字符集的碼點(diǎn)值(即字符編號(hào))映射(編碼)為碼元序列的過程屬于跟特定的計(jì)算機(jī)系統(tǒng)平臺(tái)無(wú)關(guān)的邏輯意義上的編碼,那么將碼元序列映射(編碼)為字節(jié)序列的過程就屬于跟特定的計(jì)算機(jī)系統(tǒng)平臺(tái)相關(guān)的物理意義上的編碼。

2.

由于硬件平臺(tái)與操作系統(tǒng)設(shè)計(jì)上的歷史原因,對(duì)于UTF-16、UTF-32等采用多字節(jié)碼元的編碼方式而言,必須使用一個(gè)原先稱之為零寬度不中斷空格(ZERO WIDTH NO-BREAK SPACE)字符(Unicode字符編號(hào)為FEFF)來(lái)指定字節(jié)序(Byte-Order字節(jié)順序、位元組順序,或稱為Endianness端序)是大端序還是小端序,計(jì)算機(jī)才能夠正確地進(jìn)行處理、存儲(chǔ)和傳輸。(什么是字節(jié)序以及其大端序、小端序,解釋詳見后文)

不過,對(duì)于UTF-8這種采用單字節(jié)碼元的編碼方式來(lái)說,并不存在字節(jié)序問題,不需要指明字節(jié)序。因此,在各種計(jì)算機(jī)系統(tǒng)平臺(tái)中,UTF-8編碼的碼元序列與字節(jié)序列都是相同的。(為什么UTF-8不存在字節(jié)序問題,解釋詳見后文)

3.

注意,由于字符編碼方式CEF字符編碼模式CES中都有“編碼”二字,因此,通常所說的動(dòng)詞編碼(Encode)有可能指的是通過字符編碼方式CEF將編號(hào)字符集CCS中的字符編號(hào)轉(zhuǎn)變?yōu)?b>碼元序列;也有可能指的是通過字符編碼模式CES將字符編碼方式CEF中的碼元序列轉(zhuǎn)變?yōu)樽止?jié)序列。

動(dòng)詞解碼(Decode)則反過來(lái),當(dāng)然也同樣存在兩種可能。

而通常所說的名詞編碼(CodingEncoding)也就相應(yīng)地有可能指的是碼元序列,也有可能指的是字節(jié)序列。因此,必須根據(jù)上下文語(yǔ)境來(lái)具體理解。

4.

對(duì)于程序員而言,通過字符編碼方式CEF編碼后所形成的碼元序列,更多的是一種邏輯意義上的中間編碼(即中介編碼,屬于從字符編號(hào)到字節(jié)序列的中間狀態(tài),作為將字符編號(hào)轉(zhuǎn)換為字節(jié)序列的中介而存在),不是平時(shí)直接“打交道”的對(duì)象。

而通過字符編碼模式CES將碼元序列編碼后所形成的字節(jié)序列,才是平時(shí)直接“打交道”最多的物理意義上的最終編碼(雖然事實(shí)上還有第5層的傳輸編碼語(yǔ)法TES所形成的編碼,但這種編碼畢竟僅用于某些特殊的傳輸環(huán)境,平時(shí)“打交道”的機(jī)會(huì)較少)。

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

由于歷史的原因,在某些特殊的傳輸環(huán)境中,需要對(duì)上一層次的字符編碼模式CES所提供的字節(jié)序列(字節(jié)流)作進(jìn)一步的適應(yīng)性編碼處理。一般包括兩種:

1)一種是把字節(jié)序列映射到一套更受限制的值域內(nèi),以滿足傳輸環(huán)境的限制,例如用于Email傳輸?shù)腂ase64編碼或者quoted-printable編碼(可打印字符引用編碼),都是把8位的字節(jié)映射為7位長(zhǎng)的數(shù)據(jù)(Email協(xié)議設(shè)計(jì)為僅能傳輸7位的ASCII字符);

2)另一種是壓縮字節(jié)序列的值,如LZW或者進(jìn)程長(zhǎng)度編碼等無(wú)損壓縮技術(shù)。

(這一部分內(nèi)容本文不深入闡述,有興趣者可自行查找資料。)

六、總結(jié)一下現(xiàn)代字符編碼模型:

對(duì)于Unicode這樣的現(xiàn)代字符編碼系統(tǒng)來(lái)說,同一個(gè)字符因多個(gè)不同的字符編碼方式CEF(如UTF-8、UTF-16、UTF-32等)而具有多個(gè)不同的碼元序列(Code Unit Sequence),同一個(gè)碼元序列因兩個(gè)不同的字符編碼模式CES(大端序、小端序)而又可能具有兩個(gè)不同的字節(jié)序列(Byte Sequence)

但這些不同的碼元序列也好,字節(jié)序列也好,只要表示的是同一個(gè)字符,所對(duì)應(yīng)的碼點(diǎn)值(即碼點(diǎn)編號(hào)、字符編號(hào))一般都是相同的(在Unicode標(biāo)準(zhǔn)中,為了與其它標(biāo)準(zhǔn)兼容,有少數(shù)字符可能與多個(gè)碼點(diǎn)對(duì)應(yīng))。

好了,關(guān)鍵術(shù)語(yǔ)先解釋到這里,其他術(shù)語(yǔ)將在后文中陸續(xù)解釋。

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

下一篇:刨根究底字符編碼之三——字符編碼的由來(lái)

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

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

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