01、前言

Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了。对于我们开发者来说,如何将 Emoji 存入 MySql 数据库或者取出来,就变成了一种必须掌握的技能了。

Emoji 是一种图形符号,能够很直观地反应出某种文字含义。它让我想起远古时代的象形文字。

Emoji 其实是一个日语词(えもじ),E 表示"絵",moji 表示"文字";连在一起就是"絵文字",可以更形象化地表情达意。

02、糟糕

如果我们直接将 Emoji 表情存入数据库的话,通常会出现下面这个错误。

因为数据库的字符编码一般是 utf8(支持的编码范围为 u0000-uFFFF),而 Emoji 所在的编码范围是 u1F601-u1F64F,超出 MySql 的边界了。

怎么解决这个问题呢?

03、utf8mb4

可以将 MySql 的字符集由 utf8 调整为 utf8mb4。utf8mb4 是 MySql 在 5.5.3 版本之后增加的一个编码方式,用来兼容四字节的 Unicode(包括 Emoji)。

理论上,utf8mb4 是 utf8 的超集,其中 mb4 是 most bytes 4 的意思,将字符集修改为“utf8mb4”,并不会对已有的 utf8 编码读取产生任何问题。

但通常这种方式并不是最优解,因为应用层还需要将 MySql 的连接方式作出以下调整:

jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8mb4&useSSL=false&zeroDateTimeBehavior=convertToNull

由原来的 characterEncoding=utf8 调整为 characterEncoding=utf8mb4

04、EmojiConverter

更友好的解决方式应该将 Emoji 当做字符串存储,然后在取出来的时候再转成 Emoji,这样可以兼容所有的数据库版本。

我在 GitHub 上找到了这样的一个库——EmojiConverter,它可以很方便地将 Emoji 转换为字符串的别名,同时也支持将这个别名转换为 Emoji。

1)在 pom.xml 文件中加入 EmojiConverter

<dependency><groupId>com.github.binarywang</groupId><artifactId>java-emoji-converter</artifactId><version>0.1.1</version>
</dependency>

2)存储 Emoji 之前调用 toHtml() 方法转换一下

EmojiConverter emojiConverter = EmojiConverter.getInstance();String html = emojiConverter.toHtml(keywords.getContent().trim());// JFinal 的保存方式
Record record = new Record().set("content", html)
Db.save("keywords", record);

比如说,要存储的内容当中包含了一个点赞的 Emoji。

那么通过 emojiConverter.toHtml() 转了之后的内容是什么样子呢?是一个码点:&#128077,debug 的时候截图如下所示。

这样的话,MySql 保存的内容就是一个普通的字符串了,编码方式仍然可以是 utf8。

3)显示 Emoji 的时候调用 toUnicode() 方法格式化一下

String unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);

格式化后的内容可以正常显示在微信公众号回复的文本消息中,截图如下所示。

05、最后

谢谢大家的阅读,原创不易,喜欢就点个赞,这将是我最强的写作动力。如果你觉得文章对你有所帮助,也蛮有趣的,就关注一下我的公众号,谢谢。

mysql unicode转汉字_如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他相关推荐

  1. 如果有人问你数据库的原理,看这篇文章。(超长预警)

    长文,相当的通透.以下为scrat进行总结后的删减版. 下面假定你已经知道时间复杂度 关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata .但很少有文章讲解数据 ...

  2. mysql实现心跳表_第29问:MySQL 的复制心跳说它不想跳了

    问题 最近年底,大家的数据库经常跑批量大事务,会发现复制突然断开,报错"心跳与本地信息不兼容": 会是什么原因? 实验 我们先来复现一下,再进行分析. 宽油,做一对主从数据库: 我 ...

  3. 系统崩溃mysql怎么保存表_第09问:MySQL 莫名崩溃,如何保留现场?

    问题 我的 MySQL 偶尔崩溃,如果需要追查原因,应该如何保留现场? 实验 MySQL 随着版本不停迭代,崩溃的现象越来越少,也越来越隐蔽. 一旦遇到生产环境上的 MySQL 崩溃,就需要保留现场信 ...

  4. mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库

    0 引言 还记得通常在MCU驱动LCD,OLED是怎样显示汉字的吗?采用取字模工具,生成字模数组,然后要显示某个字符,直接索引这个字符的数组,然后对这个数组数据进行显示就行了,就像这样: 最近有开发一 ...

  5. 如果有人再问你 Java 的反射,把这篇文章扔给他

    在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 Run-Time Type Identification,即运行时类 ...

  6. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  7. 再有人问你volatile是什么,把这篇文章也发给他(深入分析)

    转载自  再有人问你volatile是什么,把这篇文章也发给他 在上一篇文章中,我们围绕volatile关键字做了很多阐述,主要介绍了volatile的用法.原理以及特性.在上一篇文章中,我提到过:v ...

  8. mysql unicode转汉字_Mysql数据库表引擎与字符集

    Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...

  9. 注会和java哪个更难_总有人问我:中级和注会哪个难?现在统一回复

    原标题:总有人问我:中级和注会哪个难?现在统一回复 中级会计与注会既有联系又有区别,在就业方向上相辅相成,在学习的时候切记不要混淆方向,二者在内容上的考查有很大的不同! 一.注会的科目覆盖了中级的科目 ...

最新文章

  1. 【转】每天一个linux命令(39):grep 命令
  2. opencv 图像阈值分割图像
  3. textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
  4. weka不能使用Apriori/FPGrowth
  5. 机器学习两大利器:Boosting 与 AdaBoost
  6. 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
  7. ann matlab,MatlabANN工具箱实用指南.doc
  8. 如何使用LVM逻辑卷
  9. 从0开始学习 GitHub 系列之「02.加入 GitHub」
  10. 《工作型PPT设计之道》培训心得
  11. Python进行UDP编程
  12. 转载 :Labview和G语言
  13. 为酒店设计一套计算机网络管理系统,酒店管理系统方案设计和对策.doc
  14. 飞机大战python_飞机大战python
  15. python tkinter界面随分辨率自动调整尺寸_如何使pythonttkinter文本在按钮和标签中自动调整大小?...
  16. 360wifi架设文件服务器,360wifi怎么搭建局域网共享平台
  17. vulhub环境搭建
  18. 现在可以把小程序交给第三方开发或管理了
  19. Python GUI工具——取色器
  20. 12万字零碳智慧校园数字化节能监管管控平台建设方案2022

热门文章

  1. js实现的简单模态对话框
  2. 在C语言中以编程的方式获取函数名
  3. 实现迭代型的echo服务器
  4. Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查
  5. 反病毒引擎设计全解(二)
  6. Head First JSP---随笔九(Web应用安全)
  7. 「 每日一练,快乐水题 」1189. “气球” 的最大数量
  8. MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法
  9. SpringBoot Web原生组件注入(Servlet、Filter、Listener)
  10. MPU6050开发 -- 在 C52 单片机上测试