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