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

转载于:https://www.cnblogs.com/yutingliuyl/p/6809799.html

smartfoxserver扩展里面过滤聊天的不合法字符相关推荐

  1. a-awk外部变量传入,内部变量传出,同时过滤空格及其他字符

    变量传递 外部变量传入 lsblk|awk -v A=$A -v B=$B '{print A,B}' lsblk | awk '{print A,B}' A=$A B=$B 内部变量传出 eval ...

  2. 处理字符串_5_字符串里过滤不需要的字符

    字符串里过滤不需要的字符 需求描述 需求:过滤tmp_v视图里含数字的部分. 其中tmp_v视图的data字段的定义是emp表的ename字段拼接空格和deptno字段. 解决方法:这里通过trans ...

  3. php 过滤入库不可见字符,php如何过滤不可见字符

    php过滤不可见字符的方法:首先创建一个PHP代码示例文件:然后定义一个"filterNonPrintableChar"方法:接着通过isset.ord等函数实现过滤逻辑:最后通过 ...

  4. hive的udf,过滤表情等非法字符

    实际工作环境中hive导出数据到Mysql,总是报错 ncorrect string value: '\xF0\x9F\x98\x97\xF0\x9F-' 这是由于手机表情不支持UTF-8的 运营那边 ...

  5. 火车头使用PHP插件过滤emoji四字节字符

    方法很好用,直接出代码吧. <?phpfunction filter_emoji_string($str){ $str = trim($str); $str = preg_replace_cal ...

  6. stream流去除对象的值_I/O流(过滤流、对象序列化、字符流)

    过滤流基础 Data Stream 首先我们来介绍一对过滤流:DataInputStream 和 DataOutputStream.这两个类有什么作用呢?首先来思考下面的需求:假设,要把一个 doub ...

  7. [WinError 206] 文件名或扩展名太长(组策略值修改 解除windows文件名 字符长度限制)

    Windows 历来将路径长度限制为 260 个字符.这意味着比这更长的路径将导致编程语言相关路径函数无法解析并且会导致错误. 在最新版本的 Windows 中,此限制可以扩展到大约 32,000 个 ...

  8. 二十九、重磅:近1GB的三千万聊天语料供出

    经过半个月的倾力打造,建设好的聊天语料库包含三千多万条简体中文高质量聊天语料,近1G的纯文本数据.此语料库全部基于2万部影视剧字幕,经由爬取.分类.解压.语言识别.编码识别.编码转换.过滤清洗等一系列 ...

  9. 自己动手做聊天机器人 二十九-重磅:近1GB的三千万聊天语料供出

    Reference: http://www.shareditor.com/blogshow/?blogId=112 经过半个月的倾力打造,建设好的聊天语料库包含三千多万条简体中文高质量聊天语料,近1G ...

最新文章

  1. pythongui登录界面密码显示_用python写一个带有gui界面的密码生成器
  2. http://miicaa.yopwork.com/help/overall/
  3. NFS文件系统简介及原理
  4. Linux命令之文件处理
  5. 理想汽车致歉并宣布召回10469台车,官方:不影响后续生产和销售
  6. 【pytorch】RuntimeError: 1only batches of spatial targets supported (3D tensors) but got targets of si
  7. 编译OpenJDK12:valid values for --with-freetype are system and bundled
  8. SuperMap许可驱动安装流程详解
  9. 【数据挖掘算法与应用】——数据挖掘导论
  10. macOS Monterey 12.0 Beta版 With Clover 5136 and OC 0.7.0 and PE 三EFI分区原版黑苹果镜像
  11. 《ABAQUS 6.14超级学习手册》——2.2 特性模块(Property)
  12. html5 判断手机横竖屏,移动端判断横竖屏的5种解决方案
  13. linux更换steam目录,终于可以在Linux上愉快地玩耍Steam啦
  14. 【Leetcode竞赛杯】LCP 03. 机器人大冒险
  15. Oracle 大表数据删除/清理方法小结
  16. 关闭win10任务视图功能
  17. Oracle递归死循环怎么办?
  18. 想在公众号上做一个测试软件,公众号测试新功能想要扭转乾坤?
  19. Kindle3之中文乱码问题
  20. 链游公会打金热背后:多由矿工转型,存在多重风险 |链捕手

热门文章

  1. python3性能还低吗_谁说Python性能差的?-- 让python比awk快 (3)
  2. java 当一个文本框有值时另一个文本框置灰_【农行DevOps进行时】基于PaaS的持续集成/持续交付实践 | IDCF...
  3. 大数据 -- Hadoop集群环境搭建
  4. l洛谷P4779 【模板】单源最短路径(标准版)(dijkstra)
  5. Ubuntu系统---C++之Eclipse 开始工程项目
  6. day01 python基本概念
  7. [C][变量作用域]语句块
  8. unittest所有断言方法
  9. 以太坊系列之十一: 零起步使用remix开发智能合约
  10. 2017年天津市大学生数学竞赛试题 (理工类)