我们可以使用一对双引号或单引号来声明字符串常量(literal string):
a = "a line" b = 'another line'
使用双引号和单引号声明字符串是等价的。他们两者唯一的区别在于,使用双引号声明的字符串中出现单引号时,单引号可以不用转义;使用单引号声明的字符串中出现双引号时,双引号可以不用转义。
从代码风格上看,大多数程序员会选择使用相同的方式来声明"同一类"字符串,至于"同一类"究竟具体指什么则是依赖于具体实现的。比如,由于 XML
文本中一般都会有双引号,所以一个操作 XML
的库可能就会使用单引号来声明 XML
片段。
Lua
语言中的字符串支持下列 C
语言风格的转义字符:
转义字符 | 含义 |
\a | 响铃(bell) |
\b | 退格(back space) |
\f | 换页(form feed) |
\n | 换行(newline) |
\r | 回车(carriage return) |
\t | 水平制表符(horizontal tab) |
\v | 垂直制表符(vertical tab) |
\ | 反斜杠(backslash) |
\" | 双引号(double quote) |
\' | 单引号(single quote) |
下述示例展示了转义字符的使用方法:
> print("one line\nnext line\n\"in quotes\", 'in quotes'") one line next line "in quotes", 'in quotes' > print('a backslash inside quotes: \'\\\'') a backslash inside quotes: '\' > print("a simpler way: '\\'") a simpler way: '\'
在字符串中,还可以通过转义序列 \ddd
和 \xhh
来声明字符,其中, ddd
是由最多 3
个十进制数字组成的序列, hh
是由两个且必须是两个十六进制数字组成的序列。举一个稍微有点刻意的例子,在一个使用 ASCII
编码的系统中, "ALO\n123"
和 '\x41L0\10\04923"'
实际上是一样的: 0x41
(十进制的 65
)在 ASCII
编码中对应 A
, 10
对应换行符, 49
对应数字 1
(在这个例子中,由于转义序列之后紧跟了其他的数字,所以 49
必须写成 \049
,即用 0
来补足三位数字,否则, Lua
语言会将其错误地解析为 \492
)。我们还可以把上述字符串写成 '\x41\x4c\x0a\x31\x32\x33\x22'
,即使用十六进制来表示字符串中的每一个字符。
从 Lua5.3
开始,也可以使用转义序列 \u{h...h}
来声明 UTF-8
字符,花括号中可以支持任意有效的十六进制:
> "\u{3b1} \u{3b2} \u{3b3}" --> α β γ
提示
终端使用 UTF-8
编码才能正确输出