1. 程式人生 > >Lua處理中英文混合字串

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

這裡寫圖片描述

如果顯示區域有限制,需要只顯示其中的一段並在後面補“……”,直接使用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,這是一句測試,這是一.......

這裡寫圖片描述