34.3 文本表示形式转换

Emacs 可以将单字节文本转换为多字节文本;也可以将多字节文本转换为单字节文本,前提是该多字节文本仅包含 ASCII 字符和 8 位原始字节。通常,这类转换会在向缓冲区插入文本,或将多个字符串的内容合并为一个字符串时自动发生。你也可以显式地将字符串内容转换为其中任意一种表示形式。

Emacs 会根据构造字符串的原始文本为其选择表示形式。通用规则是:将单字节文本与其他多字节文本合并时,会把单字节文本转换为多字节文本,因为多字节表示形式更通用,能够容纳单字节文本中的所有字符。

向缓冲区插入文本时,Emacs 会根据该缓冲区的 enable-multibyte-characters 设置,将文本转换为缓冲区对应的表示形式。特别地,当你向单字节缓冲区插入多字节文本时,Emacs 会将文本转换为单字节,尽管这种转换通常无法保留多字节文本中可能存在的全部字符。另一种自然的选择——将缓冲区内容转换为多字节——是不可行的,因为缓冲区的表示形式是用户做出的选择,程序不能自动覆盖。

将单字节文本转换为多字节文本时,ASCII 字符保持不变,编码为 128 到 255 的字节会被转换为对应原始 8 位字节的多字节表示形式。

将多字节文本转换为单字节文本时,所有 ASCII 字符和 8 位字符会被转换为对应的单字节形式;而对于非 ASCII 字符,则会丢弃其码点除低 8 位之外的所有信息,从而造成数据丢失。将单字节文本先转为多字节再转回单字节,能够还原出原始的单字节文本。

下面两个函数要么直接返回参数 string,要么返回一个新建的、不包含任何文本属性的字符串。

Function: string-to-multibyte string

该函数返回一个多字节字符串,其字符序列与 string 相同。如果 string 本身已是多字节字符串,则直接返回原值。函数假定 string 仅包含 ASCII 字符和原始 8 位字节;后者会被转换为对应码点 #x3FFF80#x3FFFFF(包含两端)的多字节表示形式(see codepoints)。

Function: string-to-unibyte string

该函数返回一个单字节字符串,其字符序列与 string 相同。如果 string 本身已是单字节字符串,则直接返回原值。否则,ASCII 字符和 eight-bit 字符集中的字符会被转换为对应字节值。该函数仅适用于仅包含 ASCII 和 8 位字符的 string;若遇到其他字符,函数会抛出错误。

Function: byte-to-string byte

该函数返回一个单字节字符串,其中仅包含单个字符字节 byte。如果 byte 不是 0 到 255 之间的整数,函数会抛出错误。

Function: multibyte-char-to-unibyte char

该函数将多字节字符 char 转换为单字节字符并返回。如果 char 既不是 ASCII 也不是 8 位字符,函数返回 −1。

Function: unibyte-char-to-multibyte char

该函数将单字节字符 char 转换为多字节字符,前提是 charASCII 字符或原始 8 位字节。