TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
问题描述:第三方登录时,微信昵称和QQ昵称包含表情符或特殊字符,存储到mysql数据库时,会报错。
查了网上说是有两种做法
第一,修改数据库字符集:
这种方法需要的硬性要求就是你的mysql数据库版本5.5以后的。一般有数据库管理工具的,直接打开改了就是了,比如我用的Navicat for MySQL,直接把表改为utf8mb4 -- UTF-8 Unicode就可以了。这种方法简单省事,但是可能需要重启数据库。还有个问题是,有时候这方法不太灵。
第二,将这些表情过滤掉
既然数据库不能保存,那就直接把这些表情过滤掉好了。这种情况是损坏客户的个性而让服务更便捷的一张方式。目前很多网站就是这么处理的,毕竟效率是关键,你这表情即便保存了,也说不定哪里再次用到,展示不了。所以还是过滤emoji字符吧。
来一个简化版的:
- package com.util;
- import org.apache.commons.lang.StringUtils;
- public class SLEmojiFilter {
- /**
- * 检测是否有emoji字符
- *
- * @param source
- * @return 一旦含有就抛出
- */
- public static boolean containsEmoji(String source) {
- if (StringUtils.isBlank(source)) {
- return false;
- }
- int len = source.length();
- for (int i = 0; i < len; i++) {
- char codePoint = source.charAt(i);
- if (isEmojiCharacter(codePoint)) {
- // do nothing,判断到了这里表明,确认有表情字符
- return true;
- }
- }
- return false;
- }
- private static boolean isEmojiCharacter(char codePoint) {
- return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
- || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
- || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
- }
- /**
- * 过滤emoji 或者 其他非文字类型的字符
- *
- * @param source
- * @return
- */
- public static String filterEmoji(String source) {
- source = source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
- if (!containsEmoji(source)) {
- return source;// 如果不包含,直接返回
- }
- // 到这里铁定包含
- StringBuilder buf = null;
- int len = source.length();
- for (int i = 0; i < len; i++) {
- char codePoint = source.charAt(i);
- if (isEmojiCharacter(codePoint)) {
- if (buf == null) {
- buf = new StringBuilder(source.length());
- }
- buf.append(codePoint);
- } else {
- buf.append("*");
- }
- }
- if (buf == null) {
- return source;// 如果没有找到 emoji表情,则返回源字符串
- } else {
- if (buf.length() == len) {// 这里的意义在于尽可能少的toString,因为会重新生成字符串
- buf = null;
- return source;
- } else {
- return buf.toString();
- }
- }
- }
- }
复制代码
转载出处:http://www.itmayun.com/it/files/226631678709806/article/406117164733730/1.html
|
|