lua中字符串过滤表情及特殊字符

原文地址:http://blog.csdn.net/allenjay11/article/details/53207888


首先,这个肯定是不行的,你如果让用户输入了,并且保存成功后,但是显示的却是?,这让人怎么理解,而且用户的体验肯定不好!于是,我就开始在网上百度,但是百度的结果不符合我的意思,我又请教了 –没有开花的树–这位大神。
其实他是有一篇文章中写到了,由于我们是用lua脚本在页面上对数据进行处理的,所以就直接参考了这篇文章,并且实验结果是十分成功的。


下面附上我从没有开花的树 的博客中相关的内容供大家参考!

lua5.3虽然支持utf-8,但是自带的string库不支持汉字的处理,而且lua的正则实现也比较鸡肋,很难匹配中文。所以文章讨论UTF-8字符集,中文汉字的表示方法,然后说明lua如何匹配UTF-8中文汉字。

初识UTF-8

UTF-8是Unicode的一种实现,是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:

因此,UTF-8可以用来表示字符编码最多的有效位数是31位,即x代表的位。除掉那些标志位(如每字节开头的10),UTF-8表示的与Unicode编码是对应的。
另外,Unicode兼容标准的ASCII字符集,只需要一个字节就可以表示所有ASCII码,ASCII码一共规定了128个字符的编码,所以实际只要7位表示。而对于1字节表示的UTF-8编码,字节开头是0,所以UTF-8表示的英文数字,跟ASCII字符集表示的是一样的。

中文UTF-8

通常都说到,汉字范围从0x4E00到0x9FA5,这是指Unicode编码。对于UTF-8还要做转换。
其中,0x4E00 用二进制表示为 100111000000000
换成UTF-8码就是 11100100 10111000 10000000,即 228, 184, 128
同理,0x9FA5为 11101001 10111110 10100101,即 233, 190, 165
可以看出,中文UTF-8编码用3个字节表示。

lua匹配UTF-8汉字

前面分析了中文UTF-8的编码范围了,所以lua只要用 string.byte(s, i) 取到字符的byte值(字符集通常记 code point)。比较第一个字节是228-233,而且接下来两个字节都是 128-191,就可以简单认定为中文了。
这里以一个例子说明,比如我要过滤特殊字符,保留中文、英文和数字。

function filter_spec_chars(s)  
    local ss = {}  
    for k = 1, #s do  
        local c = string.byte(s,k)  
        if not c then break end  
        if (c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122) then  
            table.insert(ss, string.char(c))  
        elseif c>=228 and c<=233 then  
            local c1 = string.byte(s,k+1)  
            local c2 = string.byte(s,k+2)  
            if c1 and c2 then  
                local a1,a2,a3,a4 = 128,191,128,191  
                if c == 228 then a1 = 184  
                elseif c == 233 then a2,a4 = 190,c1 ~= 190 and 191 or 165  
                end  
                if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then  
                    k = k + 2  
                    table.insert(ss, string.char(c,c1,c2))  
                end  
            end  
        end  
    end  
    return table.concat(ss)  
end
可以使用Java的字符编码过滤器来解决字符串乱码的问题。具体实现可以参考以下代码: 请求过滤器: ```java public class RequestFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String encoding = "UTF-8"; // 设置编码格式为UTF-8 req.setCharacterEncoding(encoding); chain.doFilter(request, response); } } ``` 响应过滤器: ```java public class ResponseFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; String encoding = "UTF-8"; // 设置编码格式为UTF-8 res.setCharacterEncoding(encoding); chain.doFilter(request, response); } } ``` 在web.xml配置过滤器: ```xml <filter> <filter-name>RequestFilter</filter-name> <filter-class>com.example.RequestFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ResponseFilter</filter-name> <filter-class>com.example.ResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样就可以解决请求和响应字符串乱码问题了。 关于lua closure factory的完整代码,可以参考以下示例: ```lua function createClosureFactory() local count = 0 return function() count = count + 1 return function() return count end end end local closureFactory = createClosureFactory() local closure1 = closureFactory() local closure2 = closureFactory() print(closure1()) -- 输出1 print(closure2()) -- 输出2 print(closure1()) -- 输出3 print(closure2()) -- 输出4 ``` 这段代码实现了一个闭包工厂,每次调用闭包工厂都会返回一个新的闭包,闭包包含一个计数器,每次调用闭包都会返回计数器的值并将计数器加1。 关于文加密的问题,可以使用Java的加密算法对文进行加密。常用的加密算法有DES、AES、RSA等,具体实现可以参考Java官方文档或第三方库的使用说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值