最近在开发一个发红包的功能,整个功能开发完成,测试阶段没出现问题,都可以正常的抢红包,发红包,但是在准备上线的时候一个同事抢红包出现了问题,可以一直抢,后来通过和前端同事联调找到了问题:部分用户的用户名使用了表情包
原因如下:
(网上百度的方法:链接地址)
普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集
考虑到这种方法在我们项目中实施起来存在一定的局限性,所以采用了另外的方法:对用户名进行加密处理存入数据库,查询展示的时候再解密处理 ,我使用的是Base64加密解密方式,直接上图:
顺便贴上Base64Util工具类:
import java.io.UnsupportedEncodingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.*;
public class Base64Util {
private static Logger logger = LoggerFactory.getLogger(Base64Util.class);
private final static String ENCODE = "utf-8";
// 加密
public static String getBase64(String str) {
byte[] b = null;
String s = null;
try {
b = str.getBytes(ENCODE);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(),e);
}
if (b != null) {
s = new BASE64Encoder().encode(b);
}
return s;
}
// 解密
public static String getFromBase64(String s) {
byte[] b = null;
String result = null;
if (s != null) {
BASE64Decoder decoder = new BASE64Decoder();
try {
b = decoder.decodeBuffer(s);
result = new String(b, ENCODE);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
return result;
}
}
刚开始写博客,有不足还请见谅