有一段如:“是一句测试,这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)
end
function MainScene.newTTFLabel(config)
local label = nil
if config then
if config.font then
local mytext = ""
local color = cc.c3b(255, 255, 255)
local size = 22
local align = cc.TEXT_ALIGNMENT_CENTER
local vertical = cc.VERTICAL_TEXT_ALIGNMENT_CENTER
if config.text then
mytext = config.text
end
if config.color then
color = config.color
end
if config.size then
size = config.size
end
if config.vertical then
vertical = config.vertical
end
label = cc.Label:createWithTTF(mytext,config.font,size)
end
end
return label
end
return 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 = 0
for i = 1 , #str do
local byteCount = 0
local curByte = string.byte(str, i)
if curByte>0 and curByte<=127 then
byteCount = 1
elseif curByte>=192 and curByte<223 then
byteCount = 2
elseif curByte>=224 and curByte<=239 then
byteCount = 3
elseif curByte>=240 and curByte<=247 then
byteCount = 4
end
byteSize = byteSize + byteCount
end
return 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 then
local byteSize = 0
for i = 1 , #str/2 do
local byteCount = 0
local curByte = string.byte(str, i)
if curByte>0 and curByte<=127 then
byteCount = 1
elseif curByte>=192 and curByte<223 then
byteCount = 2
elseif curByte>=224 and curByte<=239 then
byteCount = 3
elseif curByte>=240 and curByte<=247 then
byteCount = 4
end
byteSize = byteSize + byteCount
end
return string.sub(str,1,byteSize)..'.......'
else
return str
end
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)
end
function MainScene:getlen(str)
local byteSize = 0
for i = 1 , #str do
local byteCount = 0
local curByte = string.byte(str, i)
if curByte>0 and curByte<=127 then
byteCount = 1
elseif curByte>=192 and curByte<223 then
byteCount = 2
elseif curByte>=224 and curByte<=239 then
byteCount = 3
elseif curByte>=240 and curByte<=247 then
byteCount = 4
end
byteSize = byteSize + byteCount
end
return byteSize
end
function MainScene:getMstr(str)
if string.utf8len(str) >= 20 then
local byteSize = 0
for i = 1 , #str/2 do
local byteCount = 0
local curByte = string.byte(str, i)
if curByte>0 and curByte<=127 then
byteCount = 1
elseif curByte>=192 and curByte<223 then
byteCount = 2
elseif curByte>=224 and curByte<=239 then
byteCount = 3
elseif curByte>=240 and curByte<=247 then
byteCount = 4
end
byteSize = byteSize + byteCount
end
return string.sub(str,1,byteSize)..'.......'
else
return str
end
end
function MainScene.newTTFLabel(config)
local label = nil
if config then
if config.font then
local mytext = ""
local color = cc.c3b(255, 255, 255)
local size = 22
local align = cc.TEXT_ALIGNMENT_CENTER
local vertical = cc.VERTICAL_TEXT_ALIGNMENT_CENTER
if config.text then
mytext = config.text
end
if config.color then
color = config.color
end
if config.size then
size = config.size
end
if config.vertical then
vertical = config.vertical
end
label = cc.Label:createWithTTF(mytext,config.font,size)
end
end
return label
end
return 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,这是一句测试,这是一.......