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