Lua 数据类型 —— 字符串

本文详细介绍了Lua中的字符串数据类型,包括字符串的不可变性质、长度获取、拼接、转义字符和多行字符串的使用。讨论了字符串到数值的转换,如tonumber函数,以及数值到字符串的转换。还深入探讨了Unicode编码在Lua 5.3中的应用,特别是utf8库的使用。最后提到了字符串的格式化和标准库中的相关函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、字符串

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值