統一碼相容字符

當講解和談論統一碼和 UCS 時，經常提到「**相容字元**」這個字眼。相容字元是指統一碼聯盟主張不要使用的圖像式字元，正如統一碼聯盟 （頁面存檔備份，存於網際網路檔案館）所說：

> 
> 若不是為了與其他標準間相容和能夠雙向對應轉換，就不會在統一碼中編碼的字元。
> 
> 

然而，其定義實在遠比這話語有更深層和複雜的意味。每個字元都有一個**標準分解**（canonical decomposition）的屬性，可是大部分字元這個屬性的值是這個字元自身，但超過五千個字元的_標準分解_屬性的值不是該字元自身。這個_標準分解_屬性值能將相容字元對映到一個或多個的其他的非相容字元，並藉此定義這五千多個字元為統一碼中的**相容字元**。指定某字元為相容字元的理由各異，下面有更詳細的說明。「分解」這個用語有時會令人感到困惑，因為有些字元「分解」後還是單個字元的形態，這時該字元的分解值就是另一個相等或近似相等的字元。相容字元與其非空值的標準分解（語意上）是確切等價的。

如果一個相容字元可以用多個分解序列表示，那麼採用了_標準順序_（canonical order）的序列是該字元的_標準分解_。例如，ộ，有兩種分解序列：（U+006F LATIN SMALL LETTER O） （U+0302 COMBINING CIRCUMFLEX ACCENT） （U+0323 COMBINING DOT BELOW）或者 （U+006F LATIN SMALL LETTER O） （U+0323 COMBINING DOT BELOW）（U+0302 COMBINING CIRCUMFLEX ACCENT），兩個附加符號出現在分解序列中的位置是可交換的。

Unicode 的另一個概念**相容性分解**（compatibility decomposition），是把一個相容字元對映為一個或多個的其他的非相容字元。但相容字元與相容性分解可能會有語意（如排版格式上）的損失。例如上角標數字字元⁴與普通的數字字元 4。

Unicode 的所有_預組合字元_（precomposed character）都是相容字元。即所有預組合字元都能夠用其他字元或字元序列來表示。因此_預組合字元_的_標準分解_總是存在。具有不同於自身且不為空值的_標準分解_屬性值的字元，稱為_標準組合字元_（canonical composite）。

## 相容字元種類和關鍵字

根據相容分解屬性的值，可將統一碼的 5,402 個字元分成 17 邏輯分類，並賦予其關鍵字。具有相容分解但沒有關鍵字的字元被稱作_標準可分解字元_，這些字元並不是相容字元。相容可分解字元的關鍵字包括：
<initial>、<medial>、<final>、<isolated>、<wide>, <narrow>、<small>、<square>、<vertical>、<circle>、<noBreak>、<fraction>、<sub>、<super> 和 <compat>。
這些關鍵字提供了一些訊息：包含相容字元和它的相容分解字元序列。
相容字元可分為以下三類：

1. 具有多個可選的字形的字元；以及對一些沒有完整的統一碼文字繪製能力的軟體或字型，含附加符號已經組合好了的字元（稱為_預組字元_或_預組合字元_）。
2. 字元可能是從其它字集而來的，或是用於_格式化文字_（Formatted text）而非純文字的字元。
3. 一些其它字元是視覺上相似但語意上不同。

因為這些語意上不同的字元有可能會使用相似的字形，文書處理軟體應該向使用者指示出其可能的混淆。當比較和排序文字字串時，同一字元的不同字形或格式化文字的不同版本不應該改變文字處理結果。例如，軟體使用者可能會困惑，在尋找一頁中的大寫字母「I」時，軟體無法找到在視覺上相似的羅馬數字「Ⅰ」（二者是_相容等價_，但不是_標準等價_）。

## 相容對應的種類

### 字形代換和組合

對於遵循統一碼標準的文字處理和顯示軟體來說，有些相容字元是不必要的。這些包含：

* **合字**：在拉丁字母老舊的字元集中，合字如『ffi』經常被作為一個字元來編碼。Unicode 的方法是把合字當作一種文字繪製的藝術，編碼時用普通字母序列來代替。
* **預組合的羅馬數字**

譬如，羅馬數十二（「Ⅻ」：U+216B）可以分解成一個羅馬數十（「Ⅹ」：U+2169）和兩個羅馬數一 (『Ⅰ』: U+2160)。Unicode 認為字元序列 'U+2169 U+2160 U+2160' 是否被組合為單個字元 'Ⅻ'，這是文字繪製軟體要處理的問題。

* **預組合的分數**：這些預組合字元具有 <fraction> 關鍵字。完全遵從 Unicode 規範的文字處理器應當繪製字元 ¼ (U+00BC) 完全同於字元序列 1⁄4 (數字 1、分數斜線 U+2044、數字 4).
* **預組合的變音字母**.

如 Å（U+00C5），統一碼傾向視為兩個分開的字元，一個拉丁字母 A （「Latin letter A」）結合一個「Combining Ring Above」（U+030A）。

* **依上下文環境而變的字形**：主要出現在阿拉伯文中。使用具有字形替換能力的字型，如 OpenType、TrueTypeGX，遵從 Unicode 規範的軟體能把出現在不同上下文環境（詞的開頭、詞的中部、詞的結尾、單獨使用）的同一字元替換為適當的字形來繪製。這種字形替換能力對於垂直文字繪製的東亞語言也是必需的。

總結而言，上述的預組合的字元的使用是不必要的，應該用普通字元的序列來表示這些預組合的字元；由遵從 Unicode 規範的字型或者文字繪製軟體來決定選用哪個字形。

Unicode 字元集（即 UCS）, Unicode 字元的屬性、Unicode 演算法為文字處理軟體實現提供了所需的一切來適當地繪製處於_分解等價_狀態的字元。因此那些_分解相容字元_變成了冗餘與不必要。字元集中_分解相容字元_的存在導致了文字處理時額外的代價用於正確地比較、排序（參見_統一碼等價性_）。此外，_分解相容字元_並沒有提供補充的或不同的語意。_分解相容字元_也沒有提供繪製時視覺上的不同，如果文字布局與字型遵循 Unicode 規範。_分解相容字元_也不是與其他字元集往返轉換所需要的，因為可以把一個字元集的分解字元序的列來對映到另一字元集的預組合的字元。 上下文中字形選擇，如阿拉伯字母可以根據它在單詞內的位置而對映到傳統字元集的具有特定字形的某個字元上。

為了處理相容字元，文字軟體必須遵從幾個 Unicode 協定。軟體必須能夠：

* 從字母字元與一個或多個單獨的_附加符號_組合出變音字母字元；
* 根據使用者的判斷，替換出合字或上下文相關的字形變種；
* 根據使用者的判斷，CJVK 文字垂直布局時，把字形替換為小的、垂直的、窄的、寬方塊等字形變種；
* 使用_分數斜線_字元 (⁄ U+2044) 與其它任意字元來組合出分數的字形。
* 能把組合字元（Combining character）正確繪製到其前的普通字元上。例如把表示現金的長斜線組合字元『Combining Long Solidus Overlay』 (̸ U+0338) 加到其它字元上，如∄

Unicode 的 5,402 個相容字元中，上述這些不應該使用在文字中的字元共計 3,779 個。這包括所有具有關鍵字 <initial>、<medial>、<final>、<isolated>、<wide>, <narrow>、<small>、<square>、<vertical>、<fraction> 的相容字元。還包括大多數具有 <compat> 關鍵字的相容字元（例外情況是有 <compat> 關鍵字的被封閉的字母數字、被封閉的象形文字、以及下文所提及)

### 格式化文字所用的相容字元

用於格式化文字的相容字元，不是 Unicode 與 UCS 所考慮的目標。格式化文字所用的相容字元，可能與普通字元在語意上有出入。例如，作為上角標的數字 4，與普通字元數字 4，可能語意上不完全等價。

格式化文字相容字元包括：

* 數學字母數字符號：拉丁字母、希臘字母、阿拉伯數字的字元，有 14 種不同的字型，用於數學文字。
* 被封閉的字母、數字、象形文字。如：⑪ ⑫ ⒄ ⒅ ⒌ ⒍ ⒲ ⒳ Ⓐ Ⓑ
* 不同寬度的空格與不換行空格。這些字元是核心的空格符 (U+0020) 與不換行空格符 (U+00A0) 的變種。 如_不換行窄空格_（Narrow No-Break Space, U+202F）、_詞連接_（Word joiner, U+2060）。
* 上角標、下角標字元。這裡包括國際音標所用的那些看似是上下角標的字元。這裡所指是拉丁字母、希臘字母、數字作為上下角標的字元。
* CJK 定義的全寬拉丁字母、阿拉伯數字，以及半寬日文、韓文字母。在 Unicode 的 Half-width and Fullwidth Forms 塊中，U+FF00 至 U+FFEF。

格式化文字相容字元共有 1,451 個，包括所有具有關鍵字 <circle> 與 <font>（除了下文列出 3 個語意不同的例外），11 個空格符的變種具有關鍵字 <compat>，具有關鍵字 <superscript> 或 <subscript> 的定義在基本多語言平面的「上標及下標」塊中的字元。 定義在 U+2100 至 U+214F 定義的 Letterlike Symbols 塊中的字元，都是具有字型格式的相容字元。

### 語意上相異字元

Unicode 對於用於科學或數學的希伯來字母、希臘字母符號，作為相容字元定義。如：

* 希伯來字母符號：alef (ℵ U+2135), bet (ℶ U+2136), gimel (ℷ U+2137), dalet (ℸ U+2138)
* 希臘字母符號：beta (ϐ U+03D0), theta (ϑ U+03D1), phi (ϕ U+03D5), pi (ϖ U+03D6), kappa (ϰ U+03F0), rho (ϱ U+03F1), 大寫 theta (ϴ U+03F4)

6 個作為度量單位的相容字元，Unicode 建議使用其等價分解的字元序列：

* Angstrom (U+212B Å ANGSTROM SIGN，應該用 U+00C5 Å LATIN CAPITAL LETTER A WITH RING ABOVE )
* Ohm (U+2126 Ω OHM SIGN, 應該用 U+03A9 Ω GREEK CAPITAL LETTER OMEGA)
* Kelvin (U+212A K , 應該用 U+004B K )
* Fahrenheit (U+2109 ℉ ， 應該用 U+00B0 ° 與 U+0046 F )
* Celsius (U+2103 ℃ ，應該用 U+00B0 ° 與 U+0043 C )
* Micro Sign (U+00B5 µ ，應該用 U+03BC μ )

Unicode 規定了 22 個類似字母的相容字元。

* 基於希臘字母的: lunate epsilon (ϵ U+03F5), lunate sigma (ϲ U+03F2), capital lunate sigma (Ϲ U+03F9), upsilon with hook (ϒ U+03D2)
* 數學常數： Euler constant (ℇ U+2107), Planck constant (ℎ U+210E), reduced Planck constant (ℏ U+210F),
* 貨幣符號: rupee sign (₨ U+20A8), rial sign (﷼ U+FDFC)
* 標點符號: one dot leader (U+2024), no-break space (U+00A0), non-breaking hyphen (U+2011), Tibetan mark delimiter tsheg bstar (U+0F0C)
* 其它類字母符號: information source (ℹ U+2139), account of (℀ U+2100), addressed to the subject (℁ U+2101), care of (℅ U+2105), cada una (℆ U+2106), numero (№ U+2116), telephone sign (℡ U+2121), facsimile sign (℻ U+213B), trademark (™ U+2122), service mark (℠ U+2120)

一些語言中，語意與字形的位置有關的字元，共計 130 個。

羅馬數字：

* 大寫羅馬數字 7 個：1 (Ⅰ U+2160), 5 (Ⅴ U+2164), 10 (Ⅹ U+2169), 50 (Ⅼ U+216C), 100 (Ⅽ U+216D), 500 (Ⅾ U+216E), 1000 (Ⅿ U+216F)
* 小寫羅馬數字 7 個：1 (ⅰ U+2170), 5 (ⅴ U+2174), 10 (ⅹ U+2179), 50 (ⅼ U+217C), 100 (ⅽ U+217D), 500 (ⅾ U+217E) ，1000 (ⅿ U+217F)
* 預組合羅馬數字 18 個：2–4, 6–9, 11–12 的大小寫版本。
* U+2180 ↀ ONE THOUSAND C D

## 相容塊

Unicode 編碼空間的幾個字元塊，都是或大部分是相容字元。

但是在「CJK Compatibility Ideographs」塊中，包含一些不是相容字元的字元：

1. (U+FA0E): 﨎
2. (U+FA0F): 﨏
3. (U+FA11): 﨑
4. (U+FA13): 﨓
5. (U+FA14): 﨔
6. (U+FA1F): 﨟
7. (U+FA21): 﨡
8. (U+FA23): 﨣
9. (U+FA24): 﨤
10. (U+FA27): 﨧
11. (U+FA28): 﨨
12. (U+FA29): 﨩

還有一個字元 U+FA23「﨣」與 U+27EAF「𧺯」重複定義。

類似情況在希伯來語、阿拉伯語也有。

## 規格化

統一碼要求軟體在進行比較或校正文句時，需要先經過相容分解，這個過程稱作規格化。這是做一些相似運算時所必須的動作，如當一個使用者進行「不區分大小寫」或「不區分附加符號的字母」的搜尋時。典型的規格化是指不會改變底層儲存的資訊（無失真）。然後，有些軟體可能會造成永久的改變，如在檔案內容中刪除標準的或非標準的相容字元（失真）。

## 參考

## 外部連結

* 漢字的標準化 － 中國哲學書電子化計劃 （頁面存檔備份，存於網際網路檔案館） － 說明如何處理統一碼相容字元所帶來的困難。