字符是一种 Lisp 对象,用于表示文本中的单个字符。在 Emacs Lisp 中,字符本质上就是整数;一个整数是否被当作字符,仅取决于它的使用方式。关于 Emacs 中字符的具体表示,see Character Codes。
字符串是固定长度的字符序列。它属于 array数组 类型的序列,意味着其长度在创建后就固定不可修改(see 序列、数组与向量)。与 C 语言不同,Emacs Lisp 字符串 不以 特殊字符码作为结束标志。
因为字符串是数组,同时也是序列,所以你可以使用《序列、数组与向量》中介绍的通用数组与序列函数来操作它们。例如,可以使用 aref 函数访问字符串中的单个字符(see 操作数组的函数)。
在 Emacs 字符串(以及缓冲区)中,非-ASCII 字符有两种文本表示方式:单字节(unibyte) 和多字节(multibyte)。对于大多数 Lisp 编程场景,你无需关心这两种表示方式的区别。详情 see Text Representations。
有时按键序列会用单字节字符串表示。当单字节字符串用作按键序列时,取值在 128~255 范围内的字符串元素代表元字符(meta 字符)(本身是大整数),而非 128~255 范围内的字符编码。字符串无法存储带有 hyper、super 或 alt 修饰键的字符;可以保存 ASCII 控制字符,但不支持其他控制字符,且不区分 ASCII 控制字符的大小写。如果你需要存储这类字符(比如按键序列),必须使用向量而非字符串。有关键盘输入字符的更多信息,see 字符类型。
字符串很适合用来存放正则表达式。你还可以用 string-match 将正则表达式与字符串进行匹配(see Regular Expression Searching)。match-string(see Simple Match Data Access)和 replace-match(see Replacing the Text that Matched)这两个函数,常用于在正则匹配后对字符串进行拆分与修改。
与缓冲区类似,字符串除了保存字符本身,还可以为其中的字符附加文本属性。See Text Properties。所有将文本从字符串复制到缓冲区或其他字符串的 Lisp 原语,都会同时复制对应字符的文本属性。
有关显示字符串或将字符串复制到缓冲区的函数,see Text。有关字符和字符串语法的说明,分别见 《字符类型》和《字符串类型》。有关文本表示方式转换、字符编码和解码的函数,see Non-ASCII Characters。另外注意:不应使用 length 计算字符串在屏幕上的显示宽度,应改用 string-width(see Size of Displayed Text)。