http://blog.csdn.net/yc7369/article/details/35567105

近期做手游客户要求加上一个聊天功能。事实上嘛,个人认为这个聊天功能比較鸡肋,这部分差点儿已经有tx被垄断,我们又何苦倘这趟浑水呢。手游聊天的游戏事实上并不多。

主要原因非常easy:server的负载会增大不少,维护更加麻烦,烧钱,而用这个功能的人也不会太多。也会出现server调控下的各种穿帮。

既然要趟这浑水,那也就没办法。聊天系统推断聊天内容是否包括有不合法字符还是须要的。

使用的是smartfoxserver服务器扩展。由于SFS默认它是UTF-8编码的,除了英文以外发送过来的字符都是会乱码的,所以我想了一天想到了以下的方法供大家參考。假设有不正确的地方请留言提出!

try {

     String[] keyword = { "操", "fuck", "叼", "cao" };

String content = json.getString("content").trim();

Pattern p = Pattern.compile("\\s*|\t|\r|\n");
//正則表達式

Matcher m = p.matcher(content);

String after = m.replaceAll(""); //把所有上述表达式的东西所有换成空字符串

after = MsgTool.gbkToutf8(after); //把所用的字符都所有转化为UTF-8编码,这样就不会出现编码问题而不能比較

boolean flag = false; // 推断是否包括屏蔽字符



for (int i = 0; i < keyword.length; i++) {



String kw = MsgTool.gbkToutf8(keyword[i]);



if (after.indexOf(kw) != -1) { //假设包括有的话就返回

flag = true;

break;

}

}

MsgJSONObject msj = MsgJSONObject.instance();

if (flag) {

log.info("实用户聊天时发送不合法字符,用户是:" + user.getName()); //发送给client说用户的聊天内容有不合法字符

msj.put("cmd", "chatUnlawful");

sendMessage(user, msj);



} else { //假设没有就正常发送



log.info("实用户聊天,用户是:" + user.getName());

log.info("聊天内容是:" + content);

msj.put("cmd", "chat");

msj.put("msg", content);

sendMessage(getRoom(user), msj);

}

} catch (Exception e) {

e.printStackTrace();

log.error("读取聊天内容错误");

}

/**编码转换。将中文变为UTF-8

* @param chenese 要中文字符

* @return

*/

public static String gbkToutf8(String chinese){

char c[] = chinese.toCharArray();

byte [] fullByte =new byte[3*c.length];

for(int i=0; i<c.length; i++){

int m = (int)c[i];

String word = Integer.toBinaryString(m);



StringBuffer sb = new StringBuffer();

int len = 16 - word.length();

//补零

for(int j=0; j<len; j++){

sb.append("0");

}

sb.append(word);

sb.insert(0, "1110");

sb.insert(8, "10");

sb.insert(16, "10");



String s1 = sb.substring(0, 8);

String s2 = sb.substring(8, 16);

String s3 = sb.substring(16);



byte b0 = Integer.valueOf(s1, 2).byteValue();

byte b1 = Integer.valueOf(s2, 2).byteValue();

byte b2 = Integer.valueOf(s3, 2).byteValue();

byte[] bf = new byte[3];

bf[0] = b0;

fullByte[i*3] = bf[0];

bf[1] = b1;

fullByte[i*3+1] = bf[1];

bf[2] = b2;

fullByte[i*3+2] = bf[2];



}



try {

String fullStr = new String(fullByte, "UTF-8");

return fullStr;

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

log.error("转换字符编码错误");

return "";

}



}

http://blog.csdn.net/yc7369/article/details/35567105

smartfoxserver扩展里面过滤聊天的不合法字符的更多相关文章

  1. JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型

    /// <summary> /// 过滤特殊字符 /// </summary> private static string String2Json(String s) { St ...

  2. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用

    一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...

  3. Python sql注入 过滤字符串的非法字符

    #coding:utf8 #在开发过程中,要对前端传过来的数据进行验证,防止sql注入攻击,其中的一个方案就是过滤用户传过来的非法的字符 def sql_filter(sql, max_length= ...

  4. XAML语法及标记扩展、附加属性、特定的字符和空白

    1.对象元素语法 使用开闭标签将对象定义一个XML元素,这种语法与其他标记语言如HTML的元素语法非常相似,在以左右尖括号保卫要设置的类或结构的类型名称.对象元素可以声明0个或多个属性,以一个或多个空 ...

  5. Java正则表达式过滤并消除非法字符

    package sd; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author 大汉 * */ ...

  6. tomcat 9.0中,用cookie进行会话时出现的不合法字符问题

    https://blog.csdn.net/KooKing_L/article/details/77435717 An invalid character [32] was present in th ...

  7. 为JFileChooser设定扩展名过滤

    --------------------siwuxie095                             工程名:TestFileChooser 包名:com.siwuxie095.fil ...

  8. (18)C++项目练习一(功能会不断扩展)--------【聊天工具】

    1.准备使用Qt和C++做一个远程(基于互联网的)聊天工具,需要实现以下功能 (1)多对多聊天功能 (2)文件传输功能 (3)注册.登录功能 (4)加好友.同意好友功能 (5)好友列表.黑名单功能(分 ...

  9. Day_09【常用API】扩展案例4_将字符串变为字符数组,并将大写字母改为小写,首尾内容不同互换,并将索引为偶数的元素替换

    分析以下需求,并用代码实现 1.键盘录入一个字符串 2.将该字符串变成字符数组(不能使用toCharArray()方法) 3.将字符数组中的所有大写字母变成小写字母(不能使用toLowerCase() ...

随机推荐

  1. python3写冒泡排序

    1.概念理解: 冒泡排序:可以简单的理解为是列表中相近的元素,两两比较,小的在前面.最多需要len()-1次排序. 2.例子:a=[11,7,4,56,35,0] 3.代码实现: 4.输出结果: 第1 ...

  2. 使用html2canvas实现网页截图,并嵌入到PDF

    使用html2canvas实现网页截图并嵌入到PDF 以前我们只能通过截图工具进行截取图像.这使得在业务生产中,变得越来越不方便.目前的浏览器功能越来越强大,H5也逐渐普及,浏览器也可以实现截图了.这 ...

  3. ie8不支持伪类选择器的解决方案

    引用jQuery的插件jquery.pseudo.js插件内容: (function($){ var patterns = { text: /^['"]?(.+?)["']?$/, ...

  4. Python装饰器粗解学习

    此次学习资料详细来自:http://blog.csdn.net/u013471155 本次是粗学,仍有诸多疑问,暂且记录一二,如有不足和建议,希望可以达者指点. 三个关键点理解:   1.关于函数“变 ...

  5. Android学习2013年10月11日

    1.LinearLayout http://www.cnblogs.com/salam/archive/2010/10/20/1856793.html LinearLayout是线性布局控件,它包含的 ...

  6. ul标签中,li标签的移除、属性值获取

  7. [luoguP1849] [USACO12MAR]拖拉机Tractor(spfa)

    传送门 神奇的spfa #include <queue> #include <cstdio> #include <cstring> #include <ios ...

  8. 2016阿里校招python研发面试

    一面: 面:说说你们学校的主修课程. 学校开的全是尼玛java课,这个我是想了有一会的. 面:看你简历写了会jquery,来问你个简单的jquery问题 :jQuery支不支持css引入. 呵呵 面: ...

  9. virtualBox下Centos系统扩展磁盘空间

    (1)查看空间容量: 打开windows命令终端.然后打开virtualbox安装目录,找到VBoxManage.exe,拖动到终端里面.输入命令:list hdds,回车. 我安装的位置是 : C: ...

  10. poj2767,单向连通图判定,缩点+重新建图+新图DFS

    /*该题被博客里标记为中等题,30分钟内1A,掌握了算法就简单了,单向连通图判定,单向连通图缩点 后必然唯一存在出度为0的点和入度为0的点,并且从入度为0的点出发,可以遍历所有点后到达出度为0点 (一 ...