博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua mysql 字符串截取_Lua 截取字符串(截取utf-8格式字符串)
阅读量:6360 次
发布时间:2019-06-23

本文共 1686 字,大约阅读时间需要 5 分钟。

首先要知道string.sub 和 string.byte 的用法。

45d2ca3d7dd38998d8533197b5db3171.png

f1e429cb32756fe4cdd4e6541886967c.png

基本思路:

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

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

所以,

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

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

1ca729c02a910fe982dd1b7d73b1852d.png

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

即:

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

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

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

local StringHelper ={}--[[

utf-8编码规则

单字节-0起头

1字节 0xxxxxxx0 - 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 charthenreturn 0end

local code= string.byte(char)if code < 127thenreturn 1elseif code<= 223thenreturn 2elseif code<= 239thenreturn 3elseif code<= 247thenreturn 4

else

-- 讲道理不会走到这里^_^

return 0end

endfunctionStringHelper.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 -1

while string.len(tempStr) > 0 do

if index == startIndex - 1then

byteStart= bytes+1;

elseif index==endIndex then

byteEnd=bytes;break;

end

bytes= bytes +StringHelper.GetBytes(tempStr)

tempStr= string.sub(str, bytes+1)

index= index + 1endreturnstring.sub(str, byteStart, byteEnd)

end

测试代码:

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))

https://www.cnblogs.com/yougoo/p/11960801.html

你可能感兴趣的文章
listView下拉刷新加载数据
查看>>
传统餐饮O2O支付体系成难题
查看>>
debian安装及使用mysql
查看>>
open()打开文件失败对应的各种错误码
查看>>
dojo.hitch 原理
查看>>
Tuple类型
查看>>
通用对象池ObjectPool的一种简易设计和实现方案
查看>>
在ubuntu下利用minicom实现串口通信
查看>>
RaPC栅格化多边形裁剪之——进化0.1
查看>>
用C#开发一个WinForm版的批量图片压缩工具
查看>>
2个函数宏技巧
查看>>
Hadoop科普文—常见的45个问题解答
查看>>
Bitcoin A First Assessment
查看>>
Bootstrap 栅格系统
查看>>
PHP数据库长连接mysql_pconnect用法
查看>>
配置nginx
查看>>
java 安装配置时出现的问题
查看>>
下拉列表在编辑的时候用到的东西
查看>>
兴奋、强类型版的PHP语言 - Hack
查看>>
解密 JavaScript 中的 this
查看>>