需要解决的问题:
玩家创建角色时有使用使用表情的情况存在,输入法表情使用的是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)) --""
搞懂各种编码还是需要花点时间的,时间紧迫曲线一下