lua 字符串過濾,特殊字符過濾


需要解決的問題:
玩家創建角色時有使用使用表情的情況存在,輸入法表情使用的是emoji字符,用unicode表示的表情圖片,由於游戲服務器沒有做字符驗證,在收到用戶輸入時只是保存了該unicode碼,玩家進入游戲因為缺少了輸入法的支持會顯示為亂碼;而當數據統計服務器(比如bi)收到這這個unicode碼時回去索引這個表情,導致NULL指針異常;
由於對unicode碼不是很了解,最終用字符長度和lua正則表達式過濾掉部分特殊字符,包括全角,帶音標字符,emoji表情等,屬於模糊范圍過濾,不算精准,只是為了解決問題;
local function utf8len(input,limitCharByteCount)
    local len = string.len(input)
    local left = len
    local cnt = 0
    local bl_out_limit = false
    local arr = {0,0xc0,0xe0,0xf0,0xf8,0xfc} --utf8可變字節特性
    while left ~= 0 do
        local tmp = string.byte(input,-left)
        local i = Err
        while arr[i] do
            if tmp >= arr[i] then
                left = left - 1
                break
            end
            i = i - 1
        end
        if i > (limitCharByteCount or 3) then --大部分需要的字符都集中在3字節內,包括中文,超過3字節就直接過濾
            bl_out_limit = true
        end
        cnt = cnt + 1
    end
    return cnt,bl_out_limit
end

local function filterChar(str,fliterLimitCharCount,filterFormat,defaultChangeStr)
    local utf8_len,bl_out_limit = utf8len(str,fliterLimitCharCount)
    if bl_out_limit then
        return defaultChangeStr or ""
    then
    local newlen,newstr = 0,""
    --default to filter the emoji
    for unchar in string.gfind(str,filterFormat or "[%z\48-\57\64-\126\226-\233][\128-\191]*") do   
        newstr = newstr .. unchar
        k_len = k_len + 1
    end
    if len ~= newlen then
        newstr = defaultChangeStr or "" --不管需要過濾的特殊字符被如何轉碼,長度不匹配直接過濾,若長度正巧匹配使用拼接后的新字符串,特殊字符會被轉為無意義的亂碼
    end
    return newstr
end

local str = "+++"
print(filterChar(str)) --""
搞懂各種編碼還是需要花點時間的,時間緊迫曲線一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM