emoji表情特殊字符出错处理

本文介绍了解决第三方登录时微信及QQ昵称中emoji表情或特殊字符导致MySQL存储报错的方法。包括调整数据库字符集至utf8mb4以及通过过滤表情字符确保服务稳定性的实用代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址为: emoji表情特殊字符出错处理

问题描述:第三方登录时,微信昵称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




转载请注明本文地址: emoji表情特殊字符出错处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值