mysql unicode转汉字_如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他
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()
转了之后的内容是什么样子呢?是一个码点:👍
,debug 的时候截图如下所示。
这样的话,MySql 保存的内容就是一个普通的字符串了,编码方式仍然可以是 utf8。
3)显示 Emoji 的时候调用 toUnicode()
方法格式化一下
String unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);
格式化后的内容可以正常显示在微信公众号回复的文本消息中,截图如下所示。
05、最后
谢谢大家的阅读,原创不易,喜欢就点个赞,这将是我最强的写作动力。如果你觉得文章对你有所帮助,也蛮有趣的,就关注一下我的公众号,谢谢。
mysql unicode转汉字_如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他相关推荐
- 如果有人问你数据库的原理,看这篇文章。(超长预警)
长文,相当的通透.以下为scrat进行总结后的删减版. 下面假定你已经知道时间复杂度 关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata .但很少有文章讲解数据 ...
- mysql实现心跳表_第29问:MySQL 的复制心跳说它不想跳了
问题 最近年底,大家的数据库经常跑批量大事务,会发现复制突然断开,报错"心跳与本地信息不兼容": 会是什么原因? 实验 我们先来复现一下,再进行分析. 宽油,做一对主从数据库: 我 ...
- 系统崩溃mysql怎么保存表_第09问:MySQL 莫名崩溃,如何保留现场?
问题 我的 MySQL 偶尔崩溃,如果需要追查原因,应该如何保留现场? 实验 MySQL 随着版本不停迭代,崩溃的现象越来越少,也越来越隐蔽. 一旦遇到生产环境上的 MySQL 崩溃,就需要保留现场信 ...
- mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库
0 引言 还记得通常在MCU驱动LCD,OLED是怎样显示汉字的吗?采用取字模工具,生成字模数组,然后要显示某个字符,直接索引这个字符的数组,然后对这个数组数据进行显示就行了,就像这样: 最近有开发一 ...
- 如果有人再问你 Java 的反射,把这篇文章扔给他
在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 Run-Time Type Identification,即运行时类 ...
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- 再有人问你volatile是什么,把这篇文章也发给他(深入分析)
转载自 再有人问你volatile是什么,把这篇文章也发给他 在上一篇文章中,我们围绕volatile关键字做了很多阐述,主要介绍了volatile的用法.原理以及特性.在上一篇文章中,我提到过:v ...
- mysql unicode转汉字_Mysql数据库表引擎与字符集
Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...
- 注会和java哪个更难_总有人问我:中级和注会哪个难?现在统一回复
原标题:总有人问我:中级和注会哪个难?现在统一回复 中级会计与注会既有联系又有区别,在就业方向上相辅相成,在学习的时候切记不要混淆方向,二者在内容上的考查有很大的不同! 一.注会的科目覆盖了中级的科目 ...
最新文章
- 【转】每天一个linux命令(39):grep 命令
- opencv 图像阈值分割图像
- textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
- weka不能使用Apriori/FPGrowth
- 机器学习两大利器:Boosting 与 AdaBoost
- 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
- ann matlab,MatlabANN工具箱实用指南.doc
- 如何使用LVM逻辑卷
- 从0开始学习 GitHub 系列之「02.加入 GitHub」
- 《工作型PPT设计之道》培训心得
- Python进行UDP编程
- 转载 :Labview和G语言
- 为酒店设计一套计算机网络管理系统,酒店管理系统方案设计和对策.doc
- 飞机大战python_飞机大战python
- python tkinter界面随分辨率自动调整尺寸_如何使pythonttkinter文本在按钮和标签中自动调整大小?...
- 360wifi架设文件服务器,360wifi怎么搭建局域网共享平台
- vulhub环境搭建
- 现在可以把小程序交给第三方开发或管理了
- Python GUI工具——取色器
- 12万字零碳智慧校园数字化节能监管管控平台建设方案2022
热门文章
- js实现的简单模态对话框
- 在C语言中以编程的方式获取函数名
- 实现迭代型的echo服务器
- Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查
- 反病毒引擎设计全解(二)
- Head First JSP---随笔九(Web应用安全)
- 「 每日一练,快乐水题 」1189. “气球” 的最大数量
- MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法
- SpringBoot Web原生组件注入(Servlet、Filter、Listener)
- MPU6050开发 -- 在 C52 单片机上测试