解释:

这些字符发现都是 emoji 表情在各个编程语言种对应的编码也不相同

原因和办法:

特殊字符一个字符有可能是一个符号由4个字节组成,但UTF-8 一个字符由3个字节组成,所有会报错

1. 在数据库中将该列的字符该为utf8mb4,

2. 存的时候,Base64 转化一下,取得时候再解密一下

附带代码:

由于前端需要 unicode 编码格式的,所有这里提供一下unicode 编码转换类

1. java 字符串转 unicode

参考:http://www.lifengdi.com/article/10047.html

package com.util.converter;/*** unicode 编码转换器* String 字符串 和 unicode 编码互相转换* 参考:http://www.lifengdi.com/article/10047.html*/
public class UnicodeConverter {public static void main(String[] args) {String str = "愛游的\uD83D\uDC1F";System.out.println(unicode(str));
//        System.out.println("decodeUnicode:" + decodeUnicode(unicode(str)));
//        System.out.println("decodeUnicode2:" + decodeUnicode2(unicode(str)));}/*** 转 unicode* @param source* @return*/public static String unicode(String source) {StringBuffer sb = new StringBuffer();char[] source_char = source.toCharArray();String unicode = null;for (int i = 0; i < source_char.length; i++) {unicode = Integer.toHexString(source_char[i]);if (unicode.length() <= 2) {unicode = "00" + unicode;}sb.append("\\u" + unicode);}
//        System.out.println(sb);return sb.toString();}/*** 还原字符串* @param unicode* @return*/public static String decodeUnicode(String unicode) {StringBuffer sb = new StringBuffer();String[] hex = unicode.split("\\\\u");for (int i = 1; i < hex.length; i++) {int data = Integer.parseInt(hex[i], 16);sb.append((char) data);}return sb.toString();}/*** 还原字符串* @param dataStr* @return*/public static String decodeUnicode2(String dataStr) {int start = 0;int end = 0;final StringBuffer buffer = new StringBuffer();while (start > -1) {end = dataStr.indexOf("\\u", start + 2);String charStr = null;if (end == -1) {charStr = dataStr.substring(start + 2, dataStr.length());} else {charStr = dataStr.substring(start + 2, end);}char letter = (char) Integer.parseInt(charStr, 16);buffer.append(new Character(letter).toString());start = end;}return buffer.toString();}}

2. 根据emoji 编码转 unicode

原创

package com.util.converter;/*** emoji 表情 代表的unicode 编码和java unicode(以UTF-16的形式) 的转换*** unicode 编码和int 一一对应的关系, 相互的转换* emoji 表情的Unified 形式,是以 U+0000 to U+FFFF 这种形式表示的,不知道对应的编码在 java 中是什么类型*/
public class UnicodeParseHex {public static String hexToUnicode(String[] hexs) {StringBuffer sbf = new StringBuffer();for (String hex:hexs ) {sbf.append(intToUnicode(Integer.parseUnsignedInt(hex.replace("U+",""),16)));}return sbf.toString();}/*** 将 以16进制 形式表示的 U+0000 to U+FFFF* (这些编码每一个对应一个对应的int 数字表示,java 中是以UTF-16 形式的unicode 表示字符串和字符的,参见java 的 Character 类的说明文档) 转换为java 对应的unicode 编码形式//     * @param hex 16进制数,不要带0x 前导符号,* @return*/public static String hexToUnicode(String hex) {return intToUnicode(Integer.parseUnsignedInt(hex.replace("U+",""),16));}public static String intToUnicode(int[] is) {StringBuffer sbf = new StringBuffer();for (int i:is ) {sbf.append(intToUnicode(i));}return sbf.toString();}/*** int 转换为对应的 unicode 编码的 java 表示形式*  对应关系例子:*  //1f41e   "\uD83D\uDC1E"   128030* @param i* @return*/public static String intToUnicode(int i) {
//        int i2 = Character.charCount(i);// 一个数字对应几个unicode 码点char [] uChars = Character.toChars(i);StringBuffer sbf = new StringBuffer();for (char c: uChars) {String str = Integer.toHexString(c);if (str.length() <= 2) {str = "00" + str;}
//            System.out.println(str);sbf.append("\\u"+str);}return sbf.toString();}/**** 根据Unicode 字符串,反解出对应的 int* 将 emoji 表情的unicode 形式(java默认形式) 转换为她对应的 十六进制的Unified 形式* 参考: http://www.cnblogs.com/hahahjx/p/4522913.html* @param unicodeStr 例如: "\uD83D\uDC1E"* @return [0] 代表值无效不是特殊字符*/public static int[] unicodeToInt(String unicodeStr) {int cpCount = unicodeStr.codePointCount(0,unicodeStr.length());// 查找unicodeString 字符串中包含的 unicode 码点数量int [] indexs = new int[2];
//        System.out.println("字符串中unicode 码点的数量:"+cpCount);for (int i = 0; i < cpCount;i++ ) {int index = unicodeStr.offsetByCodePoints(0, i);// 从左往右依次查询出现的unicode 码点的位置int codepoint = unicodeStr.codePointAt(index);//根据字符串的指定的索引,找出对应的unicode 的值(int 十进制的形式)if(isEmojiCharacter(codepoint)) {
//                System.out.println("unicode 码点对应的十进制数" + codepoint);
//                System.out.println(Integer.toHexString(codepoint));indexs[i] = index;}}
//        System.out.println(UnicodeConverter.decodeUnicode(UnicodeConverter.unicode(unicodeStr)));return indexs;}/*** 根据Unicode 字符串,反解出对应的 16 进制的数* @param unicodeStr* @return*/public static String[] unicodeToHex(String unicodeStr) {int [] indexs = unicodeToInt(unicodeStr);String [] strs = new String[indexs.length];for (int i = 0; i < indexs.length; i++) {strs[i] = Integer.toHexString(indexs[i]);}return strs;}/*** 判断是否是属于特殊字符* @param codePoint* @return*/private static boolean isEmojiCharacter(int codePoint) {return (codePoint >= 0x2600 && codePoint <= 0x27BF) // 杂项符号与符号字体|| codePoint == 0x303D|| codePoint == 0x2049|| codePoint == 0x203C|| (codePoint >= 0x2000 && codePoint <= 0x200F)//|| (codePoint >= 0x2028 && codePoint <= 0x202F)//|| codePoint == 0x205F //|| (codePoint >= 0x2065 && codePoint <= 0x206F)///* 标点符号占用区域 */|| (codePoint >= 0x2100 && codePoint <= 0x214F)// 字母符号|| (codePoint >= 0x2300 && codePoint <= 0x23FF)// 各种技术符号|| (codePoint >= 0x2B00 && codePoint <= 0x2BFF)// 箭头A|| (codePoint >= 0x2900 && codePoint <= 0x297F)// 箭头B|| (codePoint >= 0x3200 && codePoint <= 0x32FF)// 中文符号|| (codePoint >= 0xD800 && codePoint <= 0xDFFF)// 高低位替代符保留区域|| (codePoint >= 0xE000 && codePoint <= 0xF8FF)// 私有保留区域|| (codePoint >= 0xFE00 && codePoint <= 0xFE0F)// 变异选择器|| codePoint >= 0x10000; // Plane在第二平面以上的,char都不可以存,全部都转}}

mysql 保存微信特殊昵称报错,报非法字符异常相关推荐

  1. 明明是数字“1000”转换成整形时却报错---BOM 非法字符 /65279(FEFF) big endian(FEFF)和little endian(FFFE) 模式

    前言: 今天看到一个提问,说遇到了这个问题 data[0]1000 java.lang.NumberFormatException: For input string: "1000&qu ...

  2. IDEA启动项目报错:非法字符: ‘\ufeff‘

    Error:(1, 1) java: 非法字符: '\ufeff' Error:(1, 10) java: 需要class, interface或enum 解决 单文件设置:IDEA右下角将编码改为G ...

  3. mysql保存微信昵称特殊字符

    我在用mysql 保存微信昵称,当插入昵称数据的时候,报错.于是做了如下工作: 一.简介    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门 ...

  4. mysql 繁体_mysql 插入繁体字报错?报错-问答-阿里云开发者社区-阿里云

    mysql 插入繁体字报错?报错 爱吃鱼的程序员 2020-06-22 14:09:16 87 @jfinal程序插入繁体字mysql的时候报错,数据库设置了utf8,但是依然报错,数据库,表,字段, ...

  5. 记一次PHP+Mysql保存微信昵称带表情符失败案例

    记一次PHP+Mysql保存微信昵称带表情符失败案例 bug描述 做微信登陆时,出现部分用户不能等陆. 经过查看日志,发现是因为此部分用户使用了带表情的昵称. Statement could not ...

  6. ElasticSearch启动报错,报ERROR: [3] bootstrap checks failed

    ElasticSearch启动报错,报ERROR: [3] bootstrap checks failed 新装es启动时,会遇到以下错误情况: ERROR: [3] bootstrap checks ...

  7. you-get下载优酷视频报错:用户账户异常、请重新登录

    you-get下载优酷视频报错:用户账户异常.请重新登录 登录失败的含义: 虽然我下载的是不需要登录就可以观看的视频,但是还是提示登录失败,这里登录失败的含义是优酷账号登录失败.(而不是you-get ...

  8. imp 00017 由于 oracle 错误 6550,imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 20005 求大神!...

    当前位置:我的异常网» Oracle管理 » imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 2 ...

  9. TDSQL新增子set报错,DB资源异常告警解决实战

    作者:我在听风想你 大家好,这次给大家带来一个新的问题解决实战,废话不多说,直接上干货. 现象:新创建分布式实例后,分布式实例新增实例子set失败(报错与Hang住). 这个问题我们是这么发现的,需要 ...

最新文章

  1. sql多条件查询语句
  2. EasyUI中Panel面板的简单使用
  3. 0311互联网新闻 | 知乎增加“视频回答”入口;苹果将最早于今年年底生产AR设备...
  4. oppo手机android 版本号,ColorOS新系统定档!紧跟安卓发布,但版本号亮了
  5. 27日29个收集与各大资源网今日教程总汇!
  6. 怎么去进行棋牌游戏搭建,如何一步步的开发棋牌游戏
  7. 基于java springboot垃圾分类小程序源码(毕设)
  8. java实现计算器_java实现计算器功能
  9. 关于Windows 10驱动无法使用,无法验证设备所需的驱动程序的数字签名问题
  10. host文件的工作原理及应用
  11. 什么是HTML? 看这一篇就够了(附带主流IDE推荐)
  12. Windows应用程序安装向导制作
  13. 蓝牙也宽带 诺基亚3230蓝牙共享宽带教程(内网用户设置或网关无响应的解决)
  14. 2020最新整理:好用的免费/收费的第三方域名解析服务平台
  15. 读《春秋》有感之八:荀罃设计车轮战
  16. 基于HTML5的WebGL电信网管3D机房监控应用
  17. 王瑞平:挺和合国际收《火火的情怀》建交朱之文高安孟文豪谷传民
  18. ADS1.2 Error:(Fatal) L6002u:could not open file C:/...
  19. mysql计算机二级电子教程_MySQL数据库程序设计(2019年版全国计算机等级考试二级教程)...
  20. 齐鲁医药学院计算机二级,[计算机]齐鲁医药学院计算机教研室莅临指导交流会顺利举行...

热门文章

  1. 硬盘录像机通过国标GB28181协议接入EasyCVR,通道经常上下线是什么原因?
  2. 数据仓库理论进阶 - 01 《阿里大数据之路》第二篇数据模型篇
  3. Android 小功能
  4. 小白自学笔记——JAVA基础 1.4注释
  5. 快手这款推荐新算法,我爱了~
  6. lumia flash android,附教程:看看你的 Lumia 手机能不能刷安卓!
  7. 逻辑回归(LR)的原理及其推导
  8. LOL语言学算法!(会玩王者荣耀和lol就能懂)
  9. java项目开发实例SSM框架实现的车位租赁管理系统|停车场计费系统
  10. [转载]教务处重要公告