需要解決的問題:
玩家創建角色時有使用使用表情的情況存在,輸入法表情使用的是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)) --""
搞懂各種編碼還是需要花點時間的,時間緊迫曲線一下
