C++ 程式設計/軟體國際化/文字編碼
文字,特別是用來生成可讀文字的字元,依賴於字元編碼方案。該方案將給定字元集(有時稱為內碼表)中的字元序列與其他東西配對,例如自然數序列、八位位元組序列或電脈衝序列,以便於使用其數字表示。
一個容易理解的例子是摩爾斯電碼,它將拉丁字母的字母編碼為一系列長短的電報鍵按下;這類似於 ASCII 如何將字母、數字和其他符號編碼為整數。
位元組最重要的用途可能是儲存字元程式碼。鍵盤輸入、螢幕顯示和印表機列印的字元都有數值。為了使其能夠與世界其他地區通訊,IBM PC 使用 ASCII 字元集的一種變體。ASCII 字元集 中有 128 個定義的程式碼。IBM 使用剩餘的 128 個可能值來擴充套件字元程式碼,包括歐洲字元、圖形符號、希臘字母和數學符號。
在早期計算中,ASCII(1963 年)和 EBCDIC(1964 年)等編碼字元集的引入開始了標準化的過程。此類集合的侷限性很快顯現出來,並開發了許多臨時方法來擴充套件它們。需要支援多種書寫系統(語言),包括東亞指令碼的 CJK 家族,需要支援更多的字元,並需要對字元編碼採用系統方法,而不是以前臨時的方法。
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 | ||
|---|---|---|---|
| 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 |
| 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 | |
目前,大約 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 個位元組,無論它是什麼。