微信昵称含表情存mysql报错,在代码中做转码处理即可

本文介绍了一种处理emoji表情的方法,确保其能在utf-8字符集的数据库中正确存储与读取。通过正则表达式匹配并利用URLEncoder与URLDecoder进行转换,解决了emoji在不同系统间的兼容性问题。
摘要由CSDN通过智能技术生成

package com.carwash.common.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmojiUtil {

    /**
    * 
    * ============================================================================
    * @Description: TODO(将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集))
    * @author linchi 1378642054@qq.com
    * @date 2019-10-19 19:26:04
    * @param @param str
    * @param @return 设定文件
    * @throws
    * ============================================================================
    */
    public static String emojiConverStr(String str) {
    String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(str);
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
    try {
    matcher.appendReplacement(sb,
    "[[" + URLEncoder.encode(matcher.group(1), "UTF-8")
    + "]]");
    }catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    }
    matcher.appendTail(sb);
    System.out.println("emojiConvert " + str + " to " + sb.toString()
    + ", len:" + sb.length());
    return sb.toString();
    }

    /**
    * 
    * ============================================================================
    * @Description: TODO(还原utf8数据库中保存的含转换后emoji表情的字符串)
    * @author linchi 1378642054@qq.com
    * @date 2019-10-19 19:26:14
    * @param @param str
    * @param @return 设定文件
    * @throws
    * ============================================================================
    */
    public static String StrCoveryEmoji(String str) {
    String patternString = "\\[\\[(.*?)\\]\\]";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(str);

    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
    try {
    matcher.appendReplacement(sb,
    URLDecoder.decode(matcher.group(1), "UTF-8"));
    }catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    }
    matcher.appendTail(sb);
    return sb.toString();
    }
}
 

最后建议大家昵称字段使用utf8mb4类型    因为在mysql中utf8类型并非java中的utf-8对应的类型,有兴趣的朋友可以了解一下,这算是mysql官方不愿提及的一个bug吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值