对utf-8完全没概念的可以看看我上一篇随笔:简单说说utf-8编码格式

另外,还要知道string.sub 和 string.byte 的用法。

先上完整代码:

local  StringHelper = {}--[[
utf-8编码规则
单字节 - 0起头1字节  0xxxxxxx   0 - 127
多字节 - 第一个字节n个1加1个0起头2 字节 110xxxxx   192 - 2233 字节 1110xxxx   224 - 2394 字节 11110xxx   240 - 247
可能有1-4个字节
--]]
function StringHelper.GetBytes(char)if not char thenreturn 0endlocal code = string.byte(char)if code < 127 thenreturn 1elseif code <= 223 thenreturn 2elseif code <= 239 thenreturn 3elseif code <= 247 thenreturn 4else-- 讲道理不会走到这里^_^return 0end
endfunction StringHelper.Sub(str, startIndex, endIndex)local tempStr = str local byteStart = 1 -- string.sub截取的开始位置local byteEnd = -1 -- string.sub截取的结束位置local index = 0  -- 字符记数local bytes = 0  -- 字符的字节记数startIndex = math.max(startIndex, 1)endIndex = endIndex or -1while string.len(tempStr) > 0 do     if index == startIndex - 1 thenbyteStart = bytes+1;elseif index == endIndex thenbyteEnd = bytes;break;endbytes = bytes + StringHelper.GetBytes(tempStr)tempStr = string.sub(str, bytes+1)index = index + 1endreturn string.sub(str, byteStart, byteEnd)
end

基本思路:

之所以要自己写一个截取函数,是因为lua的库函数string.sub实际是字节的截取函数。

uft-8编码格式中,大部分中文是3个字节表示的,数字和字母等是一个字节的,还有某些国家的语言是2字节的,直接用string.sub就可能截出乱码来,因为不确定要截多少个字节。

所以,

定义一个GetBytes函数,获取字符的字节数(根据首个字节的高位标记,判断是几字节的字符)

然后不断后移,记录字节数和字符数。

如上图,假设要取字符3-4,那么应该从第3个字符的第一个字节取到第4个字最后一个字节

即:

当前字符数为截取的起始字符(startIndex)前一个位置时,说明从下一个字节开始截取字符串   即 index == startIndex - 1 时 byteStart = bytes+1

当前字符数为截取的终止字符(endIndex)时,说明要截取的字符串到此为止   即 index == endIndex 时 byteEnd = bytes

用 string.sub(str, byteStart, byteEnd) 就能截取byteStart 到 byteEnd 的字节

测试代码:

str = "中1文*a字符串勉強します";
print(StringHelper.Sub(str, 3, 4))
print(StringHelper.Sub(str, 1, 4))
print(StringHelper.Sub(str, 8))
print(StringHelper.Sub(str, 2, 12))

测试结果:

Lua 截取字符串(截取utf-8格式字符串)相关推荐

  1. c语言字符串 s,c – printf格式字符串中“% – *.* s”的含义是什么

    你可以在这里阅读printf的手册页: http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html.但是它更像是法律文本 ...

  2. 笔记|Python 文档注解|strftime 和 strptime(时间格式字符串)

    Python 3 官方文档地址:https://docs.python.org/zh-cn/3/library/datetime.html#strftime-and-strptime-behavior ...

  3. day-9 格式字符串和函数基础

    格式字符串和函数基础 格式字符串 格式化字符串:格式占位符 ''' 语法:包含格式占位符的字符串 % (数据1, 数据2, ...) 说明:括号中数据的个数需要格式占位符的个数保持一致格式占位符: % ...

  4. r 字符串转化为数值_Lua 字符串处理

    今天项目中遇到一个字符串处理的通用函数,一时不明白胡乱搜索后才发现原来是字符串处理库里面的通用函数,想着该理一遍字符串. 这个库提供了字符串处理的通用函数.例如字符串查找,子串,模式匹配等.当在Lua ...

  5. java字符串 大括号_string.format格式化字符串中转义大括号“{}”

    今天,用Java读取配置文件占位符,使用String.Format(string format,object arg0)方法.以前只知"{0}"为索引占位符(即格式项),与参数列表 ...

  6. mysql中字符串转时间戳_MySQL日期 字符串 时间戳互转

    mysql时间转换和事务 涉及的函数 date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to ...

  7. mysql截取字符串中的部分内容,mysql截取_Mysql批量截取特定格式字符串的最后一部分...

    摘要 腾兴网为您分享:Mysql批量截取特定格式字符串的最后一部分,有道英语,学宝,虚拟助手,微视等软件知识,以及点对点,凯立德端口,中信,小霸王,天天识字,画地图,洪恩数学,傲天,rar密码移除工具 ...

  8. MySQL截取字符串和转换日期格式

    文章目录 截取字符串 从左开始截取字符串 从右开始截取字符串 截取特定长度的字符串 按关键字进行读取 转换日期 可以使用的格式 截取字符串 从左开始截取字符串 left(str, length) 说明 ...

  9. shell中(字符串截取)

    cut是以每一行为一个处理对象的,这种机制和sed是一样的.(关于sed的入门文章将在近期发布) 2 cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢? cut命令主要是接 ...

  10. MySQL字符串截取函数

    2019独角兽企业重金招聘Python工程师标准>>> 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left ...

最新文章

  1. BLASTN format=6
  2. 嵌入式VxWorks系统开发与应用
  3. vb与S7200PLC通信源代码下载
  4. Windows scp传输文件给Linux
  5. vim语法高亮的错误解决办法
  6. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  7. C++ STL : 模拟实现STL中的容器适配器stack和queue
  8. NLog源码解读——StringBuilderPool
  9. vue 自定义指令(directive)实例
  10. VS2010中水晶报表安装应用及实例
  11. Python程序设计语言基础02:Python基本图形绘制
  12. 洛谷P4012 深海机器人问题(费用流)
  13. mysql的bht_BHT
  14. 身份证阅读器读卡器React网页方法实现身份证的读取
  15. Error: PostCSS received undefined instead of CSS string核心解决方法
  16. python加权最小二乘_如何计算加权最小二乘法的样本权重?
  17. 如何开发一个酷炫的mdx
  18. 知识点记录--x86与arm
  19. vim etc mysql my.cnf_初始化配置文件的使用:/etc/my.cnf
  20. [开源名人访谈录] Philippe Gerum

热门文章

  1. 皇室战争服务器维护是干什么的,皇室战争 2018都发生了什么 看看这里就知道了...
  2. linux so 加壳,AndroidLinker与SO加壳技术之下篇
  3. java代码 情人节_编程语言盘点程序员情人节的表白
  4. 智慧农业物联网,让农业更“智慧”
  5. 英大证券分析报告(0607)
  6. 家用投影仪好还是电视好?家用投影仪什么品牌好
  7. 华为交换机实现远程管理
  8. Python玩转微信 个性签名生成词云图
  9. C语言学习关于while(~scanf(%d, n))
  10. Linux下查看系统硬件信息