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

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

先上完整代码:

local  StringHelper = {}

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

测试结果:

最新文章

  1. jQuery插件开发代码
  2. 重载与覆盖(java)
  3. 【227】◀▶ IDL 其他常用函数
  4. core java 1~4(HelloWorld &amp; 标识符|关键字|数据类型 &amp; 表达式|流程控制 &amp; 数组)
  5. TextView过长显示省略号, TextView文字中间加横线
  6. HDU 5505 - BestCoder Round #60 - GT and numbers
  7. 射频识别技术漫谈(18)——Mifare Desfire
  8. IceMx.Mvc 我的js MVC 框架 一、html代码的分离(视图)
  9. Memcached的安装配置与测试
  10. Asp.Net Web APi 路由的特点
  11. CentOS,crontab的学习、使用、问题解决记录
  12. parcel 在js中导入 html 文件
  13. re+正则01
  14. JavaScript 图片弹框显示
  15. 从LIst集合中安全的删除元素
  16. Python学习笔记9-多线程和多进程
  17. 如何去除Launcher默认的google search bar?
  18. fabric 安装
  19. Android--用Valley框架去上传图片
  20. php内核为变量的值分配内存的几个宏

热门文章

  1. PowerShell入门学习
  2. Qt自定义窗口部件
  3. tensorflow中一个矩阵和一个向量相加
  4. [go]etcd使用
  5. centos6里面装zabbix(二)
  6. MySql锁和事务隔离级别
  7. PHP批量写入数据、批量删除数据
  8. 如何修改Zend Studio代码字体和大小
  9. 一百零二:CMS系统之sweetalert提示框和使用
  10. [windows] install cross-env with cnpm instead of yarn or npm