Lua中获取字符串长度

news/2024/11/29 13:41:27/

偶然的情况下,需要用Lua代码获取字符串的长度,结果发现结果和自己想象的不一样,一个汉字算两个英文字符的时代已经快过去了,一个中文字符打印出来的长度为3,引起了我的好奇,查找资料了解了具体原因

不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,通常是3个字符,可能是2个、4个字节;

出于效率考虑,于是又弄了一个UTF-16,不严谨地来说它等价于Unicode原生编码,它统一采用双字节表示一个字符

下面是Unicode和UTF-8转换的规则 

 

 1 Unicode 2    3 UTF-8 4    5 0000 - 007F 6    7 0xxxxxxx 8    9 0080 - 07FF 
10    
11 110xxxxx 10xxxxxx 
12    
13 0800 - FFFF 
14    
15 1110xxxx 10xxxxxx 10xxxxxx

例如"汉"字的Unicode编码是6C49

6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:

1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码

GBK、GB2312收编的汉字占2个字节,严格地用iso8859-1无法表示汉字,只能转为问号

下面是Lua获取字符串长度的方法:

方案一:

-- 获取字符串的长度(任何单个字符长度都为1)
function getStringLength(inputstr)if not inputstr or type(inputstr) ~= "string" or #inputstr <= 0 thenreturn nilendlocal length = 0  -- 字符的个数local i = 1while true dolocal curByte = string.byte(inputstr, i)local byteCount = 1if curByte > 239 thenbyteCount = 4  -- 4字节字符elseif curByte > 223 thenbyteCount = 3  -- 汉字elseif curByte > 128 thenbyteCount = 2  -- 双字节字符elsebyteCount = 1  -- 单字节字符end-- local char = string.sub(inputstr, i, i + byteCount - 1)-- print(char)  -- 打印单个字符i = i + byteCountlength = length + 1if i > #inputstr thenbreakendendreturn length
endlocal str = "I think,故我在!"
local len = getStringLength(str)
print(len)  -- 12

方案二:

-- 计算 UTF8 字符串的长度,每一个中文算一个字符
function utf8len(input)local len  = string.len(input)local left = lenlocal cnt  = 0local arr  = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}while left ~= 0 dolocal tmp = string.byte(input, left)local i   = #arrwhile arr[i] doif tmp >= arr[i] thenleft = left - ibreakendi = i - 1endcnt = cnt + 1endreturn cnt
endlocal str = "I think,故我在!"
local len = utf8len(str)
print(len)  -- 12

 

一个汉字占几个字节,详解与原理:

https://www.cnblogs.com/lslk89/p/6898526.html

https://blog.csdn.net/wowotuo/article/details/60333350

 

Lua中获取字符串长度:https://blog.csdn.net/fightsyj/article/details/83589997

 

 


http://www.ppmy.cn/news/494617.html

相关文章

数组与字符串长度 — C语言经典方法

阅读提示&#xff1a;文章比较冗长&#xff0c;若为了快速做题&#xff0c;请用常规方法sizeof和方法六计数器即可&#xff0c;其他对完成作业都没什么特别的意义&#xff0c;最后感谢您的点击与阅读&#xff5e; 文章目录 数组与字符串1 数组1.1 静态数组&#xff08;1&#x…

mysql int类型需要指定长度_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...

原先对mysql不太理解,但也没有报错。但理解的不够深入。这次补上。 原来以为int(11)是指11个字节,int(10)就是10个字节。我错了。 http://zhidao.baidu.com/link?url=puYWaGBQNKNHgffO5kdvXshF3KmX8OuB4Mor3HXapbNHa8m1CdlF8PJTqVuKa1eKcEd6Bv2NKUr3I-KJr5-7ISLhBsmf17Lu69v…

CSS 长度单位详细总结

一、CSS中的长度单位&#xff1a; 在CSS中以不少值是以长度作为值的&#xff0c;盒子模型的属性就是一些明显的值属性&#xff1a;width、height、margin、padding、border。除此之外还有很多的css属性的值同样也是长度值&#xff0c;像偏移量offset、box-shadow的大小或字体大…

循环节长度以及循环节

循环节长度 两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为&#xff1a;循环节。 比如&#xff0c;11/136>0.846153846153….. 其循环节为[846153] 共有6位。 这是一道蓝桥杯的题目&#xff0c;试卷上是一个填空题&#xff0c;思路就是不断…

关于MySQL中的字段长度

我们在MySQL中新建表时&#xff0c;需要对各个字段的属性进行设置&#xff0c;当然&#xff0c;这其中也包含了长度这一属性&#xff0c;下面就这一属性如何设置进行说明。 首先&#xff0c;sql中的长度字节&#xff0c;也即是长度设置为10&#xff0c;则该字段长度为10个字节。…

char数组长度

http://blog.csdn.net/songjinn/article/details/17194855 在VC&#xff0b;&#xff0b;编程中经常需要判断char类型数组的长度&#xff0c;以下代码可供参考。 windows系统下可以使用_mbslen函数 C/C code ? 1 2 3 4 5 6 7 8 9 #include <stdio.h> #include <mbst…

c语言字符数组的实际长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

1:定义时用字符初始化 (1)char chs[7] = {a, c, 0, z, 3,d}; // 长度为6 上式等价于: (2)char chs[7] = {a, c, 0, z, 3,d, /0}; // 长度为6 也等价于: (3)char chs[] = {a, c, 0, z, 3,d, /0 }; // 长度为6 但不等价于: (4)char chs[] = {a, c, 0, z, 3,d}; // 长度未知,…

区块链的分类与地址长度

区块链有很多类型&#xff0c;比如&#xff0c;BTC、ETH、Solana等&#xff0c;每种类型的区块链其地址长度是不同的。BTC的地址长度为34, ETH的地址长度为42(包含前缀0x)&#xff0c;Solana的地址长度的44。下面是按地址长度&#xff0c;对区块链进行分类。 1.1) 地址长度2~1…