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. 695. Max Area of Island@python

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  2. 2018美赛准备之路——Matlab基础——命令行功能函数

    clc 清屏(只清除显示内容) clear  清除所有变量(运算结果) who  显示workspace的所有变量 whos  详细显示workspace的所有变量  help sin 显示sin函数 ...

  3. [JOYOI] 1124 花店橱窗

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里.但是他们 ...

  4. MySQL sys Schema

    MySQL sys Schema 使用sys Schema的先决条件 使用sys Schema sys Schema Progress Reporting sys Schema Object Refe ...

  5. js中表格的相关操作

    tHead:表头 tBodies:表格正文 tFoot:表格尾 rows:行 cells:列 表格的应用: 1.获取 2.表格创建 3.隔行变色 4.删除一行 <!DOCTYPE html> ...

  6. mysql优化之参数优化(转)

    1.优化方式 硬件优化=>系统优化=>mysql配置优化=>SCHEMA优化=>sql优化=>其他解决方案(redis or MongoDB or Cassandra o ...

  7. pwnable.kr uaf之wp

    几乎都想要放弃了,感觉学了好久还是什么都不会,这个题好像很难的样子,有很多知识点需要补充一下: 1.[UAF]分配的内存释放后,指针没有因为内存释放而变为NULL,而是继续指向已经释放的内存.攻击者可 ...

  8. ASP.NET MVC WebAPI请求

    基础: 首先,先创建一个“ASP.NET 空Web应用程序” : 然后添加对 “System.Web.Http” 和 “System.Web.Http.WebHost” 的引用: 再添加对“Syste ...

  9. Go切片的操作

    package main import "fmt" //切片的操作 func main() { //创建slice var s []int //zero value for sli ...

  10. bzoj 2463 [中山市选2009]谁能赢呢? 博弈

    [中山市选2009]谁能赢呢? Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3014  Solved: 2165[Submit][Status][D ...