有时,将原本为单字节的现有缓冲区或字符串按多字节方式查看,或反之,会很有用。
设置当前缓冲区的文本表示类型。如果 multibyte 为非 nil,缓冲区变为多字节模式。如果 multibyte 为 nil,缓冲区变为单字节模式。
以字节序列视角查看时,该函数不会改变缓冲区内容。因此,以字符视角查看时内容可能发生变化;例如,在多字节表示中被视为一个字符的三个字节序列,在单字节表示中会算作三个字符。表示原始字节的 8 位字符是个例外:它们在单字节缓冲区中以一个字节表示,但当缓冲区设为多字节时会被转换为双字节序列,反之亦然。
该函数会设置 enable-multibyte-characters 以记录当前使用的表示形式。它还会调整缓冲区中的各类数据(包括覆盖层、文本属性和标记),使其覆盖的文本与转换前一致。
如果缓冲区处于 narrowing 状态,该函数会抛出错误,因为 narrowing 可能截断在多字节字符序列的中间。
如果缓冲区是间接缓冲区,该函数同样会抛出错误。间接缓冲区始终继承其基础缓冲区的表示形式。
下面两个函数已被废弃,将在未来版本的 Emacs 中移除;请改用 encode-coding-string。
如果 string 已是单字节字符串,该函数直接返回 string。否则,返回一个与 string 字节相同的新字符串,但将每个字节视为独立字符(因此结果的字符数可能多于原字符串);作为例外,每个表示原始字节的 8 位字符会被转换为单个字节。新建的字符串不包含任何文本属性。
如果 string 已是多字节字符串,该函数直接返回 string。否则,返回一个与 string 字节相同的新字符串,但将每个多字节序列视为一个字符。这意味着结果的字符数可能少于原字符串。如果 string 中的某段字节序列无法作为合法的单个多字节字符,则该序列中的每个字节都会被当作原始 8 位字节处理。新建的字符串不包含任何文本属性。