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“𧺯”重复定义。

类似情况在希伯来语、阿拉伯语也有。

## 规范化

统一码要求软件在进行比较或校正文句时，需要先经过相容分解，这个过程称作规范化。这是做一些相似运算时所必须的动作，如当一个使用者进行“不区分大小写”或“不区分附加符号的字母”的搜寻时。典型的规范化是指不会改变底层储存的资讯（无失真）。然后，有些软件可能会造成永久的改变，如在文件内容中删除标准的或非标准的相容字符（失真）。

## 外部链接

- 汉字的标准化 － 中国哲学书电子化计划 － 说明如何处理统一码相容字符所带来的困难。