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中获取字符串长度整理相关推荐

  1. Lua中获取字符串长度

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

  2. (转)Shell中获取字符串长度的七种方法

    Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...

  3. golang中获取字符串长度的办法

    1.不同字符与获取字符串长度 获取字符串长度,是字符串操作的重要方法.理论来说,获取字符串长度,只要从头到尾查找一遍就可以了.但遗憾的是,不同字符具有不同的编码格式.拉丁字母一个字符只要一个字节就行, ...

  4. Shell中获取字符串长度的七种方法

    求字符串操作在shell脚本中很常用,下面归纳.汇总了求字符串的几种可能方法: [方法一]:利用${#str}来获取字符串的长度 [方法二]:利用awk的length方法 备注: 1) 最好用{}来放 ...

  5. Unity中获取字符串长度、Unicode字符数量和编码ASCII,UTF,GBK的区别

    1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别: String.Length:获取的是字符串中C ...

  6. PHP中获取字符串长度的使用方法

    函数有strlen().mb_strlen()是通过计算字符串所占字节数来统计字符串长度,一个英文字符占1字节. 例如: $enStr = 'happy'; echo strlen($enStr); ...

  7. php求字符串长度函数是,PHP中获取字符串长度的函数是 。

    [判断题]探索精神不属于创新精神的表现? [单选题]从结构分类上,5-FU是( )类的抗代谢物 [单选题]当前占跨境电子商务比重较低,但增长最为迅速的是哪一部分 [多选题]要降低树木栽植后蒸腾作用以提 ...

  8. mysql中:获取字符串长度length函数和char_length函数的区别

    先上结论: length函数: 计算值的长度-但1个中文会算作长度3,1个数字或者字母-算作长度1; char_length函数: 计算值的长度-但1个中文或者1个数字或者字母-都算作长度1; sql ...

  9. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

最新文章

  1. 用python写脚本看什么书-终于知晓python编写脚本入门教程
  2. 4.Android loader详解___回调
  3. 杭电1027Ignatius and the Princess II模拟
  4. 有关计算机组成原理知识的论文,关于计算机组成原理的论文_计算机组成原理_图灵机的组成...
  5. Linux学习笔记(六)
  6. 媒体服务器协议,媒体服务器介绍(mediactrl架构)
  7. bigsur正式版clover引导_【微信首发】macOS Catalina 10.15.6 19G2021 正式版 Clover/OC/PE三分区原版镜像...
  8. Python学习 资料[转]
  9. div盒子水平垂直居中的方法
  10. (百万数据量级别)java下的mysql数据库插入越插越慢的问题解决
  11. 【车流量计数】基于matlab光流场交通汽车检测跟踪【含Matlab源码 503期】
  12. ENGINEER 05
  13. windows7下面利用docker搭建jitsi-meet测试环境
  14. Linux下安装oracle11.2.0.4
  15. 解决el-checkbox选中状态更改问题
  16. 中国剩余定理 扩展中国剩余定理
  17. 低格硬盘用什么软件_越南人用的什么聊天软件,和越南人交流用什么软件翻译...
  18. 企业微信需不需要养号?
  19. qq动态名片代码_巧用云调用,实现【共享名片夹】小程序
  20. 陆金所8.4%投资项目真实收益计算

热门文章

  1. MC9S12芯片知识相关
  2. iOS Lottie动画框架使用 AE导出JSON文件
  3. 美丽的紫荆花如何用CAD这个软件做出来?
  4. ajax加载kindeditor,jQuery读取和设定KindEditor值的方法
  5. Java获取iphone手机gps信息_html5获取手机GPS信息的示例代码分享
  6. 安卓微信 返回显示未读条数_Android仿微信底部菜单栏功能显示未读消息数量
  7. 怎么样把网站内链优化与网站外链建设做好呢?
  8. unity截取视频(录屏)并编码发送以及性能测试
  9. C4D运行light kit pro 3提示没有找到opencl动态运行库解决方法
  10. 【python爬虫专项(7)】爬虫实战项目一( 豆瓣图书类别的书籍信息数据获取——爬虫逻辑1)