Lua處理中英文混合字串
阿新 • • 發佈:2019-02-09
有一段如:“是一句測試,這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,這是一句測試,這是一.......