一、字符串
Lua 使用 八个比特位来存储 字符。(一个字节 = 八个比特位)
Lua 最好使用 UTF-8 编码。
字符串是不可变值,和 java 和 kotlin 相似,修改其中某一个字符,都是创建一个新的字符串。
Lua 对字符串会进行自动内存管理,会自动进行字符串的分配和释放。
二、函数
1、获取字符串长度
使用 #
获取字符串所占字节数,编码不同可能会有不同结果
a = "Jiang 澎涌"
print(a .. " size: " .. #a) --> Jiang 澎涌 size: 12
2、字符串拼接
使用 ..
字符串拼接,如果操作数中存在数值,则会先将数值转为字符串
3、转义字符
C 风格转义字符:
符号 | 描述 |
---|---|
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 反斜杠 |
" | 双引号 |
’ | 单引号 |
转义序列
\ddd(d 是十进制数) 、 \xhh(h 是十六进制数)
使用的是 ASCII 编码
--- 两种写法一样的表示 (A == '0x41' ,\n == '\0' ,1 == '\049')
print("ALO\n123\"") --> ALO 换行 123"
print('\x41LO\10\04923"') --> AL0 换行 123"
Lua 5.3 开始,可以使用转义序列 \u{h....h}
来声明 UTF-8 字符。 h 代表十六进制
print("\u{3b1} \u{3b2} \u{3b3}") -->α β γ
转义的使用
在某些系统下,‘\r\n’ 会被归一化为 ‘\n’ , 这个时候可以使用十进制数值或十六进制数值来表示。
可以借助一些网上工具进行获取相应编码,https://tool.chinaz.com/tools/unicode.aspx
三、多行字符串
多行字符串更多用于文本,内容中的转义序列不会被转义,并且第一个字符是换行符的话,则会被忽略。
multiLines = [[
Hello world.
Jiang Pengyong.
]]
print(multiLines)
为了应对文本中可能含有 [[
或 ]]
字符,所以可以使用 [===[
在两个 [
中夹杂 0-n 个等号,相对应的终止也要同样多的等号夹杂在 ]
中。
superMultiLines = [=====[
Hello world
Jiang Pengyong
--[[
]]
]=====]
print(superMultiLines)
可以通过 \z
去除字符串中的空白字符,直到下一个非空白字符串
data = "123\z
456"
print(data) --> 123456
四、强制类型转换
1、字符串转数值
字符串运算操作
所有针对字符串的算数操作都会尝试将字符串转为数值
print("10" + "1") --> 11
print("10" + 1) --> 11
print(10 + "1") --> 11
print(10 + 1) --> 11
print("10.0" + "1") --> 11.0
print("\"10\" + 1 ===>>", "10" + 1, math.type("10" + 1)) --> "10" + 1 ===>> 11 integer
值得注意的是比较操作,字符串不会进行转换成数值
- 不能将数值和字符串进行比较,否则异常
attempt to compare number with string
- 字符串之间比较的是字符
print("10" == 10) --> false
print("10" < 11) -- attempt to compare string with number
print(10 < "11") -- attempt to compare string with number
print