34.6 字符属性

字符属性(character property)是字符的命名属性,用于指定字符的行为方式,以及文本处理和显示过程中对该字符的处理规则。因此,字符属性是定义字符语义的重要组成部分。

总体而言,Emacs 对字符属性的实现遵循 Unicode 标准。具体来说,Emacs 支持 Unicode 字符属性模型,且 Emacs 字符属性数据库派生自 Unicode 字符数据库(UCD)。有关 Unicode 字符属性及其含义的详细说明,请参见 《Unicode 标准》的字符属性章节。本节假定你已熟悉该章节内容,并希望将相关知识应用于 Emacs Lisp 程序开发。

在 Emacs 中,每个属性都有一个符号类型的名称,以及一组可能的取值(类型因属性而异);若某个字符不具备某一属性,则其值为 nil。通常,Emacs 中的字符属性名由对应的 Unicode 属性名转换而来:将字母转为小写,并将每个 ‘_’ 替换为连字符 ‘-’。例如,Canonical_Combining_Class 会转换为 canonical-combining-class。不过,为便于使用,部分属性名会被简化。

UCD 会保留部分码点为 未分配(unassigned)状态——这些码点不对应任何字符。Unicode 标准为这类码点定义了属性的默认值;下文会针对每个属性分别说明其默认值。

以下是 Emacs 支持的所有字符属性的取值类型完整列表:

name

对应 Unicode 的 Name 属性。取值为字符串,仅包含大写拉丁字母 A-Z、数字、空格和连字符 ‘-’。未分配码点的该属性值为 nil

general-category

对应 Unicode 的 General_Category 属性。取值为符号,其名称是字符分类的两位字母缩写。未分配码点的该属性值为 Cn

canonical-combining-class

对应 Unicode 的 Canonical_Combining_Class 属性。取值为整数。未分配码点的该属性值为 0。

bidi-class

对应 Unicode 的 Bidi_Class 属性。取值为符号,其名称是字符的 Unicode 方向类型(directional type)。Emacs 在对双向文本重新排序以进行显示时会使用该属性(see 双向显示)。未分配码点的该属性值取决于其所属的编码块:大多数未分配码点取值为 L(强左向),部分取值为 AL(阿拉伯字母)或 R(强右向)。

decomposition

对应 Unicode 的 Decomposition_TypeDecomposition_Value 属性。取值为列表,首个元素可为表示兼容性格式标记的符号(如 small26);其余元素为构成该字符兼容性分解序列的字符。对于无分解序列的字符及未分配码点,该属性值为仅包含字符自身的单元素列表。

decimal-digit-value

对应 Unicode 中 Numeric_Type 为 ‘Decimal’ 的字符的 Numeric_Value 属性。取值为整数;若字符无十进制数字值,则为 nil。未分配码点的该属性值为 nil(表示 NaN,即“非数字”)。

digit-value

对应 Unicode 中 Numeric_Type 为 ‘Digit’ 的字符的 Numeric_Value 属性。取值为整数。此类字符包括兼容性下标/上标数字,其属性值为对应的数字。对于无数值的字符及未分配码点,该属性值为 nil(表示 NaN)。

numeric-value

对应 Unicode 中 Numeric_Type 为 ‘Numeric’ 的字符的 Numeric_Value 属性。取值为数字。具备该属性的字符包括分数、下标、上标、罗马数字、货币分子数和带圈数字等。例如,字符 U+2155(普通分数五分之一)的该属性值为 0.2。对于无数值的字符及未分配码点,该属性值为 nil(表示 NaN)。

mirrored

对应 Unicode 的 Bidi_Mirrored 属性。取值为符号 YN。未分配码点的该属性值为 N

mirroring

对应 Unicode 的 Bidi_Mirroring_Glyph 属性。取值为字形是该字符镜像的字符;若无定义的镜像字形,则为 nil。所有 mirrored 属性为 N 的字符,其 mirroring 属性均为 nil;但部分 mirrored 属性为 Y 的字符,其 mirroring 属性也可能为 nil(因无合适的镜像字形)。Emacs 会在需要时使用该属性显示字符的镜像形式(see 双向显示)。未分配码点的该属性值为 nil

paired-bracket

对应 Unicode 的 Bidi_Paired_Bracket 属性。取值为该字符 配对括号(paired bracket)的码点;若字符非括号,则为 nil。该属性定义了 Unicode 双向算法中视为括号对的字符映射关系;Emacs 在决定括号、大括号等字符的显示排序时会使用该属性(see 双向显示)。

bracket-type

对应 Unicode 的 Bidi_Paired_Bracket_Type 属性。对于 paired-bracket 属性非 nil 的字符,该属性值为符号 o(左括号)或 c(右括号);对于 paired-bracket 属性为 nil 的字符,取值为符号 n(无)。与 paired-bracket 类似,该属性用于双向文本显示。

old-name

对应 Unicode 的 Unicode_1_Name 属性。取值为字符串。未分配码点或无该属性的字符,其值为 nil

iso-10646-comment

对应 Unicode 的 ISO_Comment 属性。取值为字符串或 nil。未分配码点的该属性值为 nil

uppercase

对应 Unicode 的 Simple_Uppercase_Mapping 属性。取值为单个字符。未分配码点的该属性值为 nil(表示字符自身)。

lowercase

对应 Unicode 的 Simple_Lowercase_Mapping 属性。取值为单个字符。未分配码点的该属性值为 nil(表示字符自身)。

titlecase

对应 Unicode 的 Simple_Titlecase_Mapping 属性。 标题大小写(Title case)是单词首字符需要大写时使用的特殊字符形式。该属性取值为单个字符。未分配码点的该属性值为 nil(表示字符自身)。

special-uppercase

对应 Unicode 与语言/上下文无关的特殊大写转换规则。取值为字符串(可为空)。例如,字符 U+00DF(拉丁语小写字母变音 s)的该属性值为 "SS"。该映射会覆盖 uppercase 属性及当前大小写转换表。无特殊映射的字符,其值为 nil(表示需参考 uppercase 属性)。

special-lowercase

对应 Unicode 与语言/上下文无关的特殊小写转换规则。取值为字符串(可为空)。例如,字符 U+0130(带点上方的拉丁语大写字母 I)的该属性值为 "i\u0307"(即由拉丁语小写字母 i 后跟 U+0307(组合点上方)组成的双字符字符串)。该映射会覆盖 lowercase 属性及当前大小写转换表。无特殊映射的字符,其值为 nil(表示需参考 lowercase 属性)。

special-titlecase

对应 Unicode 无条件的特殊标题大小写转换规则。取值为字符串(可为空)。例如,字符 U+FB01(拉丁语小写连字 fi)的该属性值为 "Fi"。该映射会覆盖 titlecase 属性及当前大小写转换表。无特殊映射的字符,其值为 nil(表示需参考 titlecase 属性)。

Function: get-char-code-property char propname

该函数返回字符 charpropname 属性值。

(get-char-code-property ?\s 'general-category)
     ⇒ Zs
(get-char-code-property ?1 'general-category)
     ⇒ Nd
;; U+2084
(get-char-code-property ?\N{SUBSCRIPT FOUR}
                        'digit-value)
     ⇒ 4
;; U+2155
(get-char-code-property ?\N{VULGAR FRACTION ONE FIFTH}
                        'numeric-value)
     ⇒ 0.2
;; U+2163
(get-char-code-property ?\N{ROMAN NUMERAL FOUR}
                        'numeric-value)
     ⇒ 4
(get-char-code-property ?\( 'paired-bracket)
     ⇒ 41  ; closing parenthesis
(get-char-code-property ?\) 'bracket-type)
     ⇒ c
Function: char-code-property-description prop value

该函数返回属性 prop 的取值 value 对应的描述字符串;若 value 无描述,则返回 nil

(char-code-property-description 'general-category 'Zs)
     ⇒ "Separator, Space"
(char-code-property-description 'general-category 'Nd)
     ⇒ "Number, Decimal Digit"
(char-code-property-description 'numeric-value '1/5)
     ⇒ nil
Function: put-char-code-property char propname value

该函数将字符 charpropname 属性值设置为 value

Variable: unicode-category-table

该变量的值为字符表(see 字符表),为每个字符指定其 Unicode General_Category 属性(符号类型)。

Variable: char-script-table

该变量的值为字符表,根据 Unicode 标准对编码空间按书写体系块的分类,为每个字符指定表示其所属书写体系的符号。该字符表包含一个额外槽位,其值为所有书写体系符号的列表。注意:Emacs 对字符书写体系的分类并非完全对应 Unicode 标准,例如 Unicode 中并无 ‘symbol’ 书写体系。

Variable: char-width-table

该变量的值为字符表,指定每个字符在屏幕上占用的列宽。

Variable: printable-chars

该变量的值为字符表,指定每个字符是否可打印。即,若 (aref printable-chars char) 求值为 t,则该字符可打印;若为 nil,则不可打印。


Footnotes

(26)

Unicode 规范将这类标记名放在 ‘<..>’ 括号内,但 Emacs 中的标记名不含括号;例如,Unicode 中的 ‘<small>’ 在 Emacs 中写作 ‘small’。