34.9 字符转换

转换表(translation table)是一种字符表(see 字符表), 用于指定字符到字符的映射。这类表用于编码、解码及其他用途。 部分编码系统会指定自身专用的转换表;同时也存在适用于所有其他编码系统的默认转换表。

转换表包含两个额外槽位。第一个为 nil 或执行反向转换的转换表; 第二个为转换字符序列时最多查找的字符数量(参见下方 make-translation-table-from-alist 的说明)。

Function: make-translation-table &rest translations

该函数根据参数 translations 返回一个转换表。 translations 中的每个元素应为形如 (from . to) 的列表; 表示将字符 from 转换为 to

参数及各参数内的映射按顺序处理,若先前的映射已将 to 转换为其他字符(记为 to-alt), 则 from 也会被转换为 to-alt

解码时,转换表的映射会作用于普通解码得到的字符。 若某个编码系统具有 :decode-translation-table 属性, 该属性指定要使用的转换表,或按顺序应用的一组转换表。 (该属性属于编码系统本身,由 coding-system-get 返回, 而非编码系统名称符号的属性。See 编码系统基础概念. ) 最后,若 standard-translation-table-for-decodenil, 所得字符会通过该表进行转换。

编码时,转换表的映射会作用于缓冲区中的字符,转换结果会被实际编码。 若某个编码系统具有 :encode-translation-table 属性, 该属性指定要使用的转换表,或按顺序应用的一组转换表。 此外,若变量 standard-translation-table-for-encodenil, 则指定用于转换最终结果的转换表。

Variable: standard-translation-table-for-decode

解码操作的默认转换表。若编码系统指定了自身的转换表, 且该变量值非 nil,则其对应的表会在之后应用。

Variable: standard-translation-table-for-encode

编码操作的默认转换表。若编码系统指定了自身的转换表, 且该变量值非 nil,则其对应的表会在之后应用。

Variable: translation-table-for-input

自动插入的字符在插入缓冲区前会通过该转换表进行转换。 搜索命令也会通过该表转换其输入,以便与缓冲区内容更可靠地进行比较。

该变量在设置时会自动变为缓冲区局部变量。

Function: make-translation-table-from-vector vec

该函数根据 vec 返回一个转换表,vec 为包含 256 个元素的数组, 用于将字节(取值 0 至 #xFF)映射为字符。无需转换的字节对应元素可为 nil。 返回的表在第一个额外槽位中存放反向映射转换表,第二个额外槽位值为 1

该函数提供了便捷方式创建私有编码系统,实现单个字节到指定字符的映射。 你可在 define-coding-systemprops 参数中, 分别通过 :decode-translation-table:encode-translation-table 属性 指定返回的表及其反向转换表。

Function: make-translation-table-from-alist alist

该函数与 make-translation-table 类似, 但返回复杂转换表而非简单的一对一映射。 alist 中的每个元素形如 (from . to), 其中 fromto 可为字符或指定字符序列的向量。 若 from 为字符,则该字符转换为 to(即单个字符或字符序列)。 若 from 为字符向量,则该序列转换为 to。 返回的表在第一个额外槽位存放反向映射转换表, 第二个额外槽位存放所有 from 字符序列的最大长度。