zoukankan      html  css  js  c++  java
  • 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 "[%z48-5764-126226-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)) --""
    搞懂各种编码还是需要花点时间的,时间紧迫曲线一下

  • 相关阅读:
    Hive内部表外部表转化分析
    20130515
    mapred.local.dir
    经典
    hive中巧用正则表达式的贪婪匹配
    做生意十大忌
    股价是最没有用的东西,要看公司基本面和盈利
    textView文本不同颜色
    Android中扫描wifi热点
    android 与 PC的socket通信
  • 原文地址:https://www.cnblogs.com/fegnze/p/4566340.html
Copyright © 2011-2022 走看看