Unicode相容字符

當講解和談論統一碼和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 邏輯分類，並賦予其關鍵字。具有相容分解但沒有關鍵字的字符被稱作標準可分解字符，這些字符並不是相容字符。相容可分解字符的關鍵字包括：

,、和。

這些關鍵字提供了一些訊息：包含相容字符和它的相容分解字符序列。

相容字符可分為以下三類：

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

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

## 相容對應的種類

### 字形代換和組合

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

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

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

- 預組合的分數：這些預組合字符具有關鍵字。完全遵從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個。這包括所有具有關鍵字、,、的相容字符。還包括大多數具有關鍵字的相容字符（例外情況是有關鍵字的被封閉的字母數字、被封閉的象形文字、以及下文所提及)

### 格式化文本所用的相容字符

用于格式化文本的相容字符，不是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個，包括所有具有關鍵字與（除了下文列出3個語義不同的例外），11個空格符的變種具有關鍵字，具有關鍵字或的定義在基本多語言平面的「上標及下標」塊中的字符。定義在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 (212B，應該用00C5 )
- Ohm (, 應該用03A9)
- Kelvin (212a, 應該用004b)
- Fahrenheit (應該用00b0與)
- Celsius (應該用00b0與)
- Micro Sign (00b5，應該用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的大小寫版本。

## 相容塊

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

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

- (U+FA0E): 﨎
- (U+FA0F): 﨏
- (U+FA11): 﨑
- (U+FA13): 﨓
- (U+FA14): 﨔
- (U+FA1F): 﨟
- (U+FA21): 﨡
- (U+FA23): 﨣
- (U+FA24): 﨤
- (U+FA27): 﨧
- (U+FA28): 﨨
- (U+FA29): 﨩

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

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

## 規範化

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

## 外部連結

- 漢字的標準化 － 中國哲學書電子化計劃 － 說明如何處理統一碼相容字符所帶來的困難。