跳轉到內容

C++ 程式設計/軟體國際化/文字編碼

來自華夏公益教科書,自由的教學讀物

文字編碼

[編輯 | 編輯原始碼]

文字,特別是用來生成可讀文字的字元,依賴於字元編碼方案。該方案將給定字元集(有時稱為內碼表)中的字元序列與其他東西配對,例如自然數序列、八位位元組序列或電脈衝序列,以便於使用其數字表示。

一個容易理解的例子是摩爾斯電碼,它將拉丁字母的字母編碼為一系列長短的電報鍵按下;這類似於 ASCII 如何將字母、數字和其他符號編碼為整數。

文字和資料

[編輯 | 編輯原始碼]

位元組最重要的用途可能是儲存字元程式碼。鍵盤輸入、螢幕顯示和印表機列印的字元都有數值。為了使其能夠與世界其他地區通訊,IBM PC 使用 ASCII 字元集的一種變體。ASCII 字元集 中有 128 個定義的程式碼。IBM 使用剩餘的 128 個可能值來擴充套件字元程式碼,包括歐洲字元、圖形符號、希臘字母和數學符號。

在早期計算中,ASCII(1963 年)和 EBCDIC(1964 年)等編碼字元集的引入開始了標準化的過程。此類集合的侷限性很快顯現出來,並開發了許多臨時方法來擴充套件它們。需要支援多種書寫系統(語言),包括東亞指令碼的 CJK 家族,需要支援更多的字元,並需要對字元編碼採用系統方法,而不是以前臨時的方法。

關於 UNICODE 的介紹

[編輯 | 編輯原始碼]

Unicode 是一種行業標準,其目標是提供一種方法,使所有形式和語言的文字都可以編碼以供計算機使用。Unicode 6.1 於 2012 年 1 月釋出,是當前版本。它目前包含來自 93 種文字系統的 109,000 多個字元。由於 Unicode 只是將數字分配給字元的標準,因此還需要有將這些數字編碼為位元組的方法。三種最常見的字元編碼是 UTF-8、UTF-16 和 UTF-32,其中 UTF-8 是迄今為止最常用的編碼。

在 Unicode 標準中,平面 是數值(碼點)的組,指向特定字元。Unicode 碼點在邏輯上劃分為 17 個平面,每個平面有 65,536 (= 216) 個碼點。平面由 0 到 16十進位制 的數字標識,對應於六位格式(hhhhhh)中前兩位的可能值 00-10十六進位制。截至版本 6.1,這六個平面中的六個已分配了碼點(字元),並已命名。

平面 0 - 基本多語言平面 (BMP)
平面 1 - 補充多語言平面 (SMP)
平面 2 - 補充表意文字平面 (SIP)
平面 3–13 - 未分配
平面 14 - 補充專用平面 (SSP)
平面 15–16 - 補充專用區 (S PUA A/B)

BMP 和 SMP

[編輯 | 編輯原始碼]
BMP SMP
0000–0FFF 8000–8FFF 10000–10FFF 18000-18FFF
1000–1FFF 9000–9FFF 11000–11FFF 19000-19FFF
2000–2FFF A000–AFFF 12000–12FFF 1A000-1AFFF
3000–3FFF B000–BFFF 13000–13FFF 1B000-1BFFF
4000–4FFF C000–CFFF 14000-14FFF 1C000-1CFFF
5000–5FFF D000–DFFF 15000-15FFF 1D000–1DFFF
6000–6FFF E000–EFFF 16000–16FFF 1E000–1EFFF
7000–7FFF F000–FFFF 17000-17FFF 1F000–1FFFF

ISP 和 SSP

[編輯 | 編輯原始碼]
SIP SSP
20000–20FFF 28000–28FFF E0000–E0FFF
21000–21FFF 29000–29FFF  
22000–22FFF 2A000–2AFFF  
23000–23FFF 2B000–2BFFF  
24000–24FFF    
25000–25FFF    
26000–26FFF    
27000–27FFF 2F000–2FFFF  
PUA
F0000–F0FFF F8000–F8FFF 100000–100FFF 108000–108FFF
F1000–F1FFF F9000–F9FFF 101000–101FFF 109000–109FFF
F2000–F2FFF FA000–FAFFF 102000–102FFF 10A000–10AFFF
F3000–F3FFF FB000–FBFFF 103000–103FFF 10B000–10BFFF
F4000–F4FFF FC000–FCFFF 104000–104FFF 10C000–10CFFF
F5000–F5FFF FD000–FDFFF 105000–105FFF 10D000–10DFFF
F6000–F6FFF FE000–FEFFF 106000–106FFF 10E000–10EFFF
F7000–F7FFF FF000–FFFFF 107000–107FFF 10F000–10FFFF

目前,大約 10% 的潛在空間被使用。此外, Unicode 聯盟已為所有已知的現代和古代書寫系統(文字系統)臨時映射出了字元範圍。雖然 Unicode 最終可能需要使用另一個備用平面來表示表意文字,但其他平面仍然存在。即使發現了之前未知的文字系統,其中包含數萬個字元,但 1,114,112 個碼點的限制也不太可能在短期內達到。Unicode 聯盟已宣告該限制永遠不會改變。

奇怪的限制(不是 2 的冪)不是由於 UTF-8 造成的,UTF-8 的設計限制為 231 個碼點(32768 個平面),並且即使限制為 4 個位元組,也可以編碼 221 個碼點(32 個平面),而是由於 UTF-16 的設計造成的。在 UTF-16 中,兩個 16 位 的“代理對”用於編碼 220 個碼點 1 到 16,此外還使用單個字來編碼平面 0。

UTF-8 是 Unicode 的可變長度編碼,每個字元使用 1 到 4 個位元組。它旨在與 ASCII 相容,因此,單位元組值在 UTF-8 中表示的字元與它們在 ASCII 中表示的相同。因為 UTF-8 流不包含 '\0',所以您可以直接在現有的 C++ 程式碼中使用它,無需進行任何移植(除了在計算其中的“實際”字元數時除外)。

UTF-16 也是可變長度的,但它使用 16 位單元而不是 8 位單元,因此每個字元由 2 個或 4 個位元組表示。這意味著它與 ASCII 不相容。

與前兩種編碼不同,UTF-32 不是 可變長度的:每個字元都由正好 32 位表示。這使得編碼和解碼變得更容易,因為 4 位元組值直接對映到 Unicode 程式碼空間。缺點是空間效率低下,因為每個字元都需要 4 個位元組,無論它是什麼。

華夏公益教科書