有一段如:“是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是一句测试,这是一句测试,这是一句测试,这是一句测试.”这样的中英文混合在一起的字符串,需要显示在游戏中:

local MainScene = class("MainScene", cc.load("mvc").ViewBase)function MainScene:ctor()local str = '是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是一句测试,这是一句测试,这是一句测试,这是一句测试.'local label = self.newTTFLabel({text = str,font = "fonts/DFYUANW7-GB2312.ttf",size = 20})label:setAnchorPoint(0,0)self:addChild(label)label:setPosition(200,200)
endfunction MainScene.newTTFLabel(config)local label = nilif config thenif config.font thenlocal mytext = ""local color = cc.c3b(255, 255, 255)local size = 22local align = cc.TEXT_ALIGNMENT_CENTERlocal vertical = cc.VERTICAL_TEXT_ALIGNMENT_CENTERif config.text then mytext = config.textendif config.color then color = config.colorendif config.size then size = config.sizeendif config.vertical thenvertical = config.verticalendlabel = cc.Label:createWithTTF(mytext,config.font,size)endendreturn label
endreturn MainScene

如果显示区域有限制,需要只显示其中的一段并在后面补“……”,直接使用string.sub(str,1,#str/2):

    local subStr = string.sub(str,1,#str/2)print('--string.sub(str,1,#str/2)--',subStr)local label = self.newTTFLabel({text = subStr,font = "fonts/DFYUANW7-GB2312.ttf",size = 20})label:setAnchorPoint(0,0)self:addChild(label)label:setPosition(200,200)

结果

[LUA-print] --string.sub(str,1,#str/2)--    是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是?

在最后会有一个“?”,不能创建Label。

按照以下方法可以正确的截取一段并能创建Label。
首先需要明确:

    print("--string.utf8len(str)--",string.utf8len(str))print("--#str--",#str)print("--string.len(str)--",string.len(str))
[LUA-print] --string.utf8len(str)-- 65
[LUA-print] --#str--    149
[LUA-print] --string.len(str)-- 149

string.utf8len(str) 有多少个字符
(#str)和string.len(str) 有多少字节

下面的代码:

function MainScene:getlen(str)local byteSize = 0for i = 1 , #str dolocal byteCount = 0local curByte = string.byte(str, i)if curByte>0 and curByte<=127 thenbyteCount = 1elseif curByte>=192 and curByte<223 thenbyteCount = 2elseif curByte>=224 and curByte<=239 thenbyteCount = 3elseif curByte>=240 and curByte<=247 thenbyteCount = 4endbyteSize = byteSize + byteCountendreturn byteSize
end

也可以得出str有多少字节

print("--self:getlen(str)--",self:getlen(str))
[LUA-print] --self:getlen(str)--    149

将getlen()改写为:

function MainScene:getMstr(str)if string.utf8len(str) >= 20 thenlocal byteSize = 0for i = 1 , #str/2 dolocal byteCount = 0local curByte = string.byte(str, i)if curByte>0 and curByte<=127 thenbyteCount = 1elseif curByte>=192 and curByte<223 thenbyteCount = 2elseif curByte>=224 and curByte<=239 thenbyteCount = 3elseif curByte>=240 and curByte<=247 thenbyteCount = 4endbyteSize = byteSize + byteCountendreturn string.sub(str,1,byteSize)..'.......'elsereturn strend
end

改写后的代码可以正确的截取一半的字符并可以创建Label。
完整代码:

local MainScene = class("MainScene", cc.load("mvc").ViewBase)function MainScene:ctor()local str = '是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是一句测试,这是一句测试,这是一句测试,这是一句测试.'local subStr = string.sub(str,1,#str/2)print('--string.sub(str,1,#str/2)--',subStr)print("--string.utf8len(str)--",string.utf8len(str))print("--#str--",#str)print("--string.len(str)--",string.len(str))print("--self:getlen(str)--",self:getlen(str))print("--self:getMstr(str)--",self:getMstr(str))local label = self.newTTFLabel({text = self:getMstr(str),font = "fonts/DFYUANW7-GB2312.ttf",size = 20})label:setAnchorPoint(0,0)self:addChild(label)label:setPosition(200,200)
endfunction MainScene:getlen(str)local byteSize = 0for i = 1 , #str dolocal byteCount = 0local curByte = string.byte(str, i)if curByte>0 and curByte<=127 thenbyteCount = 1elseif curByte>=192 and curByte<223 thenbyteCount = 2elseif curByte>=224 and curByte<=239 thenbyteCount = 3elseif curByte>=240 and curByte<=247 thenbyteCount = 4endbyteSize = byteSize + byteCountendreturn byteSize
endfunction MainScene:getMstr(str)if string.utf8len(str) >= 20 thenlocal byteSize = 0for i = 1 , #str/2 dolocal byteCount = 0local curByte = string.byte(str, i)if curByte>0 and curByte<=127 thenbyteCount = 1elseif curByte>=192 and curByte<223 thenbyteCount = 2elseif curByte>=224 and curByte<=239 thenbyteCount = 3elseif curByte>=240 and curByte<=247 thenbyteCount = 4endbyteSize = byteSize + byteCountendreturn string.sub(str,1,byteSize)..'.......'elsereturn strend
endfunction MainScene.newTTFLabel(config)local label = nilif config thenif config.font thenlocal mytext = ""local color = cc.c3b(255, 255, 255)local size = 22local align = cc.TEXT_ALIGNMENT_CENTERlocal vertical = cc.VERTICAL_TEXT_ALIGNMENT_CENTERif config.text then mytext = config.textendif config.color then color = config.colorendif config.size then size = config.sizeendif config.vertical thenvertical = config.verticalendlabel = cc.Label:createWithTTF(mytext,config.font,size)endendreturn label
endreturn MainScene

结果

[LUA-print] --string.sub(str,1,#str/2)--    是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是?
[LUA-print] --string.utf8len(str)-- 65
[LUA-print] --#str--    149
[LUA-print] --string.len(str)-- 149
[LUA-print] --self:getlen(str)--    149
[LUA-print] --self:getMstr(str)--   是一句测试,这pppppp[[[[[[aaaaxxxxxx,这是一句测试,这是一.......

Lua处理中英文混合字符串相关推荐

  1. C#实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错.尤其是插入中英文混合字符串时,SQL Server中一般中文要占 ...

  2. php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例

    本文实例讲述了PHP针对中英文混合字符串长度判断及截取方法.分享给大家供大家参考,具体如下: /** * * 中英混合字符串长度判断 * @param unknown_type $str * @par ...

  3. 中英文混合字符串长度的获取

    在项目中要处理中英文混合字符串的长度,中文按2个字符算,英文按1个字符算.以下是我处理的方法,不知道有没有更好的方法. private int GetGBLength(string strData) ...

  4. Javascript中得到中英文混合字符串的长度

    有同事在公司的OA上发了个贴子,介绍在javascript中如何得到中英文混合字符串的长度. 用的是正则表达式. var str = "坦克是tank的音译";var len = ...

  5. 计算中英文混合字符串长度

    - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//第一种方法NS ...

  6. ASP如何计算中英文混合字符串长度和截取字符串

    用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际 ...

  7. php截取英语,php 截取中英文混合字符串的方法

    php 截取中应为字符串,就不必再用substr或者mb_substr //截取想这样的字符串 a李三 利用ASCII /** * * 中英混合的字符串截取 * @param unknown_type ...

  8. PHP截取中英文混合字符串

    <?php /*** 截取中英文混合字符串* @param $sourcestr 需要截取的字符串* @param $start 开始位置,字符位置,* @param $cutlength 结束 ...

  9. Lua截取utf-8编码的中英文混合字符串

    参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度)utf8sub("你好1世界哈哈",2,5) = 好 ...

最新文章

  1. volatile和synchronized的区别
  2. java中path和classpath_java中的环境变量path和classpath的作用-Go语言中文社区
  3. 《人人都是产品经理》读后感
  4. java基础—List集合的常规方法操作
  5. SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
  6. HM使用之2 Working Directory的解释
  7. Reachability
  8. Ubuntu中DenyHosts安装及配置
  9. MCS-51子程序库(二)
  10. Apache RewriteCond on HTTP_COOKIE
  11. IIS建立两个站点服务,只有一个公网IP
  12. DATEADD日期函数的使用
  13. 关于SQL注入及防御
  14. 北京极通EWebs与服务器蓝屏死机
  15. ubuntu 22.04安装微信QQ阿里旺旺等
  16. b区计算机复试国家线,2017考研A区B区及各学科国家线预测解析
  17. 计算机应用程序没声音,电脑没有声音怎么办,五个步骤解决电脑没声音
  18. iOS10 本地通知
  19. 为什么夏天家里空调滴水
  20. c语言对随机数进行快速排序,C语言快速排序与二分查找算法示例

热门文章

  1. Linux入门笔记-尚硅谷韩顺平-基础篇实操篇
  2. 达人评测i5 1340p和i7 12700h差距 酷睿i51340p和i7 12700h选哪个
  3. 从下面四个方面,写电商平台运营经理试用期工作清单,试用期三个月,每个月写一份 1.商城运营 2.技术开发需求 3.跨境商城改造 4.抖音开店运营...
  4. Android菜鸟历程2
  5. Linux Framebuffer编程之lcd屏幕显示jpeg图像
  6. promis取值问题 --- 通过.then
  7. 机器人的避障常用方案
  8. H5页面中的视频轮播(类似于banner轮播图效果)
  9. Chrome扩展:Run Selected HTML
  10. mybatis jdbcType的作用,无效的列类型错误解决办法