在 Emacs 字符串中,非-ASCII 字符有两种文本表示方式:多字节(multibyte)和单字节(unibyte)(see Text Representations)。简单来说,单字节字符串存储原始字节,而多字节字符串存储人类可读的文本。单字节字符串中的每个字符都是一个字节,即其值在 0~255 之间。与之相对,多字节字符串中的每个字符值可以在 0~4194303 之间(see 字符类型)。在这两种表示中,大于 127 的字符都是非-ASCII 字符。
你可以在字符串常量中直接书写非-ASCII 字符。如果字符串常量从多字节源读取(例如多字节缓冲区或字符串、以多字节模式打开的文件),Emacs 会将每个非-ASCII 字符按多字节字符读取,并自动将该字符串设为多字节字符串。如果字符串常量从单字节源读取,Emacs 会将非-ASCII 字符按单字节读取,并将字符串设为单字节。
除了在多字节字符串中直接写字符,你也可以使用转义序列按字符编码来书写。关于转义序列的详情,See 通用转义语法。
如果在字符串常量中使用任何 Unicode 风格的转义序列 ‘\uNNNN’ 或 ‘\U00NNNNNN’ (即使是 ASCII 字符),Emacs 会自动将其视为多字节字符串。
你也可以在字符串常量中使用十六进制转义序列(‘\xn’)和八进制转义序列(‘\n’)。但请注意:如果字符串常量只包含八进制转义序列,或一两位的十六进制转义序列,且这些转义都表示单字节字符(即码点小于 256),同时字符串中没有其他直接书写的非-ASCII 字符或 Unicode 风格转义,Emacs 会自动将其视为单字节字符串。也就是说,它会把字符串中所有非-ASCII 字符都当作 8 位原始字节。
在十六进制和八进制转义序列中,转义的字符编码可以包含可变数量的数字,因此后续第一个不是有效十六进制 / 八进制数字的字符会终止转义。如果字符串的下一个字符可能被解析为十六进制或八进制数字,可以写 ‘\ ’ (反斜杠加空格)来终止转义序列。例如,‘\xe0\ ’ 表示一个字符:带重音的字母 ‘a’。字符串常量中的 ‘\ ’ 与反斜杠换行类似;它不会向字符串添加任何字符,但会终止前面的十六进制转义。