博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决旧版MySql无法存储emoji表情的问题
阅读量:7089 次
发布时间:2019-06-28

本文共 2346 字,大约阅读时间需要 7 分钟。

hot3.png

在记录用户从app传过来的信息时可能会带有emoji表情符,但是MySql存储不了,保存时会报异常,想让MySql存储emoji表情可以将数据库的字符集调整为utf8mb4格式,但是只有5.5.3以上的版本才会有这样的编码,但是总不能为了这么个表情升级服务器的数据库,可以使用工具类进行转换,存储的时候转换一次,取出来以后再转换回来即可解决这个问题

 public class EmojiUtil {    /**     * 将str中的emoji表情转为byte数组     *     * @param str     * @return     */    public static String resolveToByteFromEmoji(String str) {        Pattern pattern = Pattern                .compile("[^(\u2E80-\u9FFF\\w\\s`~!@#\\$%\\^&\\*\\(\\)_+-?()——=\\[\\]{}\\|;。,、《》”:;“!……’:'\"<,>\\.?/\\\\*)]");        Matcher matcher = pattern.matcher(str);        StringBuffer sb2 = new StringBuffer();        while (matcher.find()) {            matcher.appendReplacement(sb2, resolveToByte(matcher.group(0)));        }        matcher.appendTail(sb2);        return sb2.toString();    }    /**     * 将str中的byte数组类型的emoji表情转为正常显示的emoji表情     *     * @param str     * @return     */    public static String resolveToEmojiFromByte(String str) {        Pattern pattern2 = Pattern.compile("<:([[-]\\d*[,]]+):>");        Matcher matcher2 = pattern2.matcher(str);        StringBuffer sb3 = new StringBuffer();        while (matcher2.find()) {            matcher2.appendReplacement(sb3, resolveToEmoji(matcher2.group(0)));        }        matcher2.appendTail(sb3);        return sb3.toString();    }    private static String resolveToByte(String str) {        byte[] b = str.getBytes();        StringBuffer sb = new StringBuffer();        sb.append("<:");        for (int i = 0; i < b.length; i++) {            if (i < b.length - 1) {                sb.append(Byte.valueOf(b[i]).toString() + ",");            } else {                sb.append(Byte.valueOf(b[i]).toString());            }        }        sb.append(":>");        return sb.toString();    }    private static String resolveToEmoji(String str) {        str = str.replaceAll("<:", "").replaceAll(":>", "");        String[] s = str.split(",");        byte[] b = new byte[s.length];        for (int i = 0; i < s.length; i++) {            b[i] = Byte.valueOf(s[i]);        }        return new String(b);    }    /**     * 将byte数组类型的emoji表情替换为指定的字符串     *     * @param str     * @param replace     * @return     */    public static String replaceEmojiFromByte(String str, String replace) {        return str.replaceAll("<:([[-]\\d*[,]]+):>", replace);    }}

 

转载于:https://my.oschina.net/857359351/blog/670313

你可能感兴趣的文章
[转] 理解 LSTM 网络
查看>>
读取bin文件,并且按结构体赋值打印
查看>>
Java基础积累
查看>>
【Android每日一讲】2012.11.06 Android变脸 - 主题(Theme)实现
查看>>
redis 系列12 哈希对象
查看>>
asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问
查看>>
QTP使用心得
查看>>
uva1388 Graveyard
查看>>
JS 页面跳转
查看>>
JS调用android逻辑方法
查看>>
由3D touch所想到的那些。
查看>>
C# 类&结构体&枚举
查看>>
js/jq ajax+数组。个人整理
查看>>
CentOS7永久挂载硬盘
查看>>
从源码总结struts2命名空间的匹配规则
查看>>
如何看财报-转
查看>>
js点击修改按钮后修改
查看>>
线程池--ThreadPoolExecutor
查看>>
二维码扫描开源库ZXing定制化
查看>>
display:inline-block下,元素不能在同一水平线及元素间无margin间距的问题解决方法...
查看>>