Lua处理中英文混合字符串

有一段如:“是一句测试,这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

Lua处理中英文混合字符串_第1张图片

如果显示区域有限制,需要只显示其中的一段并在后面补“……”,直接使用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。

Lua处理中英文混合字符串_第2张图片

按照以下方法可以正确的截取一段并能创建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,这是一句测试,这是一.......

你可能感兴趣的:(lua)