Lua中获取字符串长度整理
在 Lua 中,获取字符串长度我们一般使用 #str(不建议使用 string.len(str) )!
local str = "abc"
local len = #str
print(len) -- 3str = "你们好"
len = #str
print(len) -- 9
这里就出现了一个问题:为啥字符串 abc 的长度为 3,而字符串 你们好 的长度却是 9 呢?难道是哪里出问题了?当然不是!
其实这是字符编码导致的,在使用 UTF-8 字符编码的情况下,一个中文字符一般占 3 个字节,所以 3 个中文字符自然就是 9 个字节咯!
那么问题来了,现在我需要不管是中文字符还是其他字符,长度都为 1 该咋整呢?
这里记录两种方案:
方案一
-- 获取字符串的长度(任何单个字符长度都为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
归根结底其实就是对 UTF-8 字符编码进行处理!
参考:
关于字符编码的八个点
在Lua中计算含中文的字符串的长度
Lua中获取字符串长度整理相关推荐
- Lua中获取字符串长度
偶然的情况下,需要用Lua代码获取字符串的长度,结果发现结果和自己想象的不一样,一个汉字算两个英文字符的时代已经快过去了,一个中文字符打印出来的长度为3,引起了我的好奇,查找资料了解了具体原因 不同的 ...
- (转)Shell中获取字符串长度的七种方法
Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...
- golang中获取字符串长度的办法
1.不同字符与获取字符串长度 获取字符串长度,是字符串操作的重要方法.理论来说,获取字符串长度,只要从头到尾查找一遍就可以了.但遗憾的是,不同字符具有不同的编码格式.拉丁字母一个字符只要一个字节就行, ...
- Shell中获取字符串长度的七种方法
求字符串操作在shell脚本中很常用,下面归纳.汇总了求字符串的几种可能方法: [方法一]:利用${#str}来获取字符串的长度 [方法二]:利用awk的length方法 备注: 1) 最好用{}来放 ...
- Unity中获取字符串长度、Unicode字符数量和编码ASCII,UTF,GBK的区别
1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别: String.Length:获取的是字符串中C ...
- PHP中获取字符串长度的使用方法
函数有strlen().mb_strlen()是通过计算字符串所占字节数来统计字符串长度,一个英文字符占1字节. 例如: $enStr = 'happy'; echo strlen($enStr); ...
- php求字符串长度函数是,PHP中获取字符串长度的函数是 。
[判断题]探索精神不属于创新精神的表现? [单选题]从结构分类上,5-FU是( )类的抗代谢物 [单选题]当前占跨境电子商务比重较低,但增长最为迅速的是哪一部分 [多选题]要降低树木栽植后蒸腾作用以提 ...
- mysql中:获取字符串长度length函数和char_length函数的区别
先上结论: length函数: 计算值的长度-但1个中文会算作长度3,1个数字或者字母-算作长度1; char_length函数: 计算值的长度-但1个中文或者1个数字或者字母-都算作长度1; sql ...
- c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...
最新文章
- 用python写脚本看什么书-终于知晓python编写脚本入门教程
- 4.Android loader详解___回调
- 杭电1027Ignatius and the Princess II模拟
- 有关计算机组成原理知识的论文,关于计算机组成原理的论文_计算机组成原理_图灵机的组成...
- Linux学习笔记(六)
- 媒体服务器协议,媒体服务器介绍(mediactrl架构)
- bigsur正式版clover引导_【微信首发】macOS Catalina 10.15.6 19G2021 正式版 Clover/OC/PE三分区原版镜像...
- Python学习 资料[转]
- div盒子水平垂直居中的方法
- (百万数据量级别)java下的mysql数据库插入越插越慢的问题解决
- 【车流量计数】基于matlab光流场交通汽车检测跟踪【含Matlab源码 503期】
- ENGINEER 05
- windows7下面利用docker搭建jitsi-meet测试环境
- Linux下安装oracle11.2.0.4
- 解决el-checkbox选中状态更改问题
- 中国剩余定理 扩展中国剩余定理
- 低格硬盘用什么软件_越南人用的什么聊天软件,和越南人交流用什么软件翻译...
- 企业微信需不需要养号?
- qq动态名片代码_巧用云调用,实现【共享名片夹】小程序
- 陆金所8.4%投资项目真实收益计算
热门文章
- MC9S12芯片知识相关
- iOS Lottie动画框架使用 AE导出JSON文件
- 美丽的紫荆花如何用CAD这个软件做出来?
- ajax加载kindeditor,jQuery读取和设定KindEditor值的方法
- Java获取iphone手机gps信息_html5获取手机GPS信息的示例代码分享
- 安卓微信 返回显示未读条数_Android仿微信底部菜单栏功能显示未读消息数量
- 怎么样把网站内链优化与网站外链建设做好呢?
- unity截取视频(录屏)并编码发送以及性能测试
- C4D运行light kit pro 3提示没有找到opencl动态运行库解决方法
- 【python爬虫专项(7)】爬虫实战项目一( 豆瓣图书类别的书籍信息数据获取——爬虫逻辑1)