0x01:Lua字符串

  • Lua语言中的字符串是一串字节组成的序列,Lua核心并不关心这些字节是以何种编码方式储存文本。
  • Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串中存储任意二进制数据
  • Lua的字符串标准库默认处理8个比特位的字符,但也可以非常优雅地处理UTF-8字符串。
  • 从Lua 5.3版本之后,Lua还提供了一个用于处理UTF-8编码的函数库;所以在一切条件允许的情况下,我们尽可能使用UTF-8编码。
  • Lua语言中的字符串是不可变量
    我们没法修改某个字符串中的某个字符,但是我们可以通过创建一个新字符串来达到修改的目的

lua字符串
与Lua的其他对象(表、函数等)一样,字符串是Lua自动内存管理的对象之一,Lua会负责它的分配与释放,开发人员无须关注。

  • Lua字符串长度
    我们可以通过长度操作符#来获取字符串的长度

lua字符串长度

  • 在某些编码中,这个值可能与字符串中的字符的个数不同

0x02:字符串常量

  • 在Lua语言中可以使用一对双引号或一对单引号来声明字符串常量
    lua字符串声明
  • 同时,你也可以使用[[ string ]]来声明多行字符串
    多行字符串

    • 在某种特殊情况下,多行字符串中可能也会包含]]的情况,这种情况可能会导致在]]之后的字符都被丢弃了。
      为了解决这种情况,可以在两个左括号之间添加任意数量的等号,这样Lua只有在遇到有相同数量等号的右括号时才会结束

    长字符串

  • Lua语言中支持下列C语言风格的转义字符
\a    响铃
\b    退格
\f    换页
\n    换行
\r    回车
\t    水平制表符
\v    垂直制表符
\\    反斜杠
\"    双引号
\'    单引号
  • Lua字符串拼接
    在Lua语言中,我们可以使用连接操作符..将俩个字符串拼接起来

字符串拼接
在很多语言中,字符串的拼接常用+来进行,但是在Lua中+..是不同的!
不同之处
如果操作对象中含有数值,那么它会先被转换成字符串,再进行拼接
数值转换
由于Lua语言中,字符串是不可变量。所以字符串拼接不会改变原来的字符串,而是创建一个新的字符串
字符串拼接不改变源值

0x03:强制类型转换

  • Lua语言在运行时提供了数值与字符串之间的自动转换。

    • 当Lua发现在字符串操作相关的地方出现了数值,它就会先把数值转化为字符串
      自动转换
    • 相反,当在数值操作过程中出现了字符串,则会尝试将字符串转换为数值,再进行操作
      数值操作
    • 由于Lua 5.3并没有实现强制类型转换与整型的集成,而且算术运算规则中要求俩个值都要为整型值时,结果才会是整型值
      但是字符串很明显不是整型值,所以Lua 5.3版本以上Lua 5.4以下字符串与数值的运算都是浮点运算,返回的结果只会是浮点值

    lua字符串算术计算

    • 但是在Lua 5.4之后,只要字符串中的值能被转换为整型值,则会被转为整型后再进行数值操作
      lua54字符串与数值
  • 显式类型转换
    如果我们需要显式地将一个字符串转换成数值,可以调用tonumber函数

    • 当字符串中的有效数字能被转换整型数值时,则会返回整型数值,否则返回浮点数值
      显式数值转换
    • 若字符串中的内容不能表示为有效数值时,则会返回nil
      无效数值
    • 默认情况下,函数tonumber使用的是十进制,但是也可以指定使用其他进制
      指定进制
  • 当然,可以从字符串转成数值,就可以从数值转换成字符串
    调用tostring函数可以将数值转换为字符串

数值转换字符串

0x04:字符串标准库

Lua语言解释器本身处理字符串的能力是十分有限的。它处理字符串的完整能力来自于其字符串标准库string

  • string.len(s)返回字符串s的长度
  • string.rep(s,n)返回将字符串s重复n次的结果
  • string.lower(s)将字符串s中的字符全部转换为小写
  • string.upper(s)将字符串s中的字符全部转换为大写
  • string.reverse(s)将字符串s翻转

字符串操作

  • string.sub(s,i.j)返回字符串s中从第i个到第j个字符;支持负索引(即从字符串的结尾开始计数)

字符串截取

  • string.char()接收零个或多个整数作为参数,然后将每个整数转换成对应的字符,最后返回这些字符连接而成的字符串
  • string.byte(s,i)将字符串s的第i个字符转换成整数;当未指定第二个参数时,默认转换字符串中第一个字符

ASCII转换

  • string.format是用于进行字符串格式化和将数值输出为字符串的强大工具
    该函数能将传入的字符串中存在的占位符替换成传入的对应参数,并将格式化完成后的字符串返回

字符串格式化

  • string.find(s1,s2)返回字符串s2在字符串s1中进行模式匹配,若找到则返回s2在s1中的起始位置与结束位置,否则返回nil

字符串的模式匹配

  • string.match(s1,s2)该函数与string.find类似,不过`string.match返回的是匹配成功后的子串,支持正则表达式

string.match

  • string.gsub(s,s1,s2)会将在模式匹配中匹配成功的子串替换为指定字符串,并返回替换完成后的字符串与替换次数

字符串替换

  • string.gmatch(s,s1)返回一个迭代器函数,每调用一次该迭代器函数则会在字符串s中找到下一个符合的子串,并将其返回;若找不到符合的子串,则返回nil

string.gmatch

0x05:UTF8标准库

从Lua 5.3开始,Lua语言引入了一个用于操作UTF-8编码的Unicode编码标准库。当然,在这引入这个标准库之前,Lua虽然也提供了对UTF-8字符串很好的支持。不过Lua字符串标准库中,有很多函数并不适用于UTF-8字符串,这时候就需要utf8标准库来帮忙啦。

  • utf8.len(s)返回UTF-8编码的字符串s的长度

utf8.len

  • utf8.codepointutf8.char在UTF-8环境下等同于string.bytestring.char

codepoint与char

  • utf8.offset用于将字符串中字符位置转换为字节位置
    utf8.offset

配合调用string.sub函数我们可以将UTF-8字符串中的指定字符取出
从UTF-8取出指定子串

  • utf8.codes用于遍历UTF8字符串中的每一个字符
-- FILE: 10_utf8_codes.lua

s = "机智的狐狸菌"
for i, c in utf8.codes(s) do
    print(i, c, utf8.char(c))
end

utf8.codes

0x06:参考文献

Last modification:April 11th, 2021 at 06:57 pm
给狐宝打点钱⑧