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 邏輯分類,並賦予其關鍵字。具有相容分解但沒有關鍵字的字元被稱作標準可分解字元,這些字元並不是相容字元。相容可分解字元的關鍵字包括: <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 , 應該用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「𧺯」重複定義。

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

規範化

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

參考

外部連結