关于表情符号与UTF-8的探讨

4-23

 

现在无论原生还是网页端,表情符号绝大部分都可以正常显示,但是也有一部分是不能正常显示的。但存入到mysql的时候,不能够正常显示的表情符号,就会让mysql(utf-8)拜拜了。这个不仅仅是显示问题,很重要的一点是,会让绝大部分玩家的游戏记录被无情抹去,无法记录。

 

 

先举两个例子:

微信名:  base64加密后:8J+Xrw==             

微信名:  base64加密后:4pmj

 

第一个名字,算是一个比较新的表情符号,我参考了TX的游戏,

在王者荣耀上面,在S10赛季前,这个表情符号是用两个特殊字符来表现的(忘了截图),大概就是这样的吧

 

,而S11赛季更新之后就变成这样显示了

 

,而且,以前的表情符号在王者荣耀里面是可以输入的,现在已经禁止输入表情

符号了,现在统一由这个字符代表表情符号

表情符号的处理还有待改进呀

 

2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、

叙利亚文及它拿字母则需要二个字节编码

 

3个字节的:基本等同于GBK,含21000多个汉字

 

4个字节的:中日韩超大字符集里面的汉字,有5万多个

 

再来看看这个表情符号的base64解码,能够正常显示

 

 

 

但是这个就挂了,完全显示不出来

 

 

 

下面就来看看,解密后他是个什么东西

 

不能正常显示的表情符号解密后长度为2,能正常显示的就是1

再来看看他们的Unicode编码(charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数),看起来也没什么大的区别。但是长度却不同,UTF-8编码有可能是两个、三个、四个字节Emoji表情是4个字节,MySQLutf8编码最多3个字节,所以数据插不进去,这就导致了数据腰斩的问题,数据都被这个不能插入的东西切成两份了。

 

 

接下来翻查一下这两个表情,

输入55357(不显示的表情的第一个字符),显示如下:

 

 

长度为2的字符串(显示不出来的表情符号),我们可以这样理解,它里面有两个字符(55357和56815),每一个字符转出来有三个字符,长度达到了3,那就是55357这个字符占了9个字节 ,就是说他一个字符占位已经超出了3字节的长度了   (本人的理解下,只是猜测)。

 

 

输入9827),显示如下:

 

 

 

 

 

以上是长度为1的字符串,我们可以这样理解,那他占了3个字节,完全可以显示和存储在utf-8的数据结构里。

 

再看一下普通汉字的字节占位

 

也是可以显示的。

来看看游戏数据库里游戏记录的数据结构:

 

 

Utf-8/不区分大小写,可以,那样这个结构就会被我那个表情搞死了。

很明显,一些比较新的表情符号,是超过了3个字节的,所以就会出现类似以下的腰斩数据

 

, name的值和后面的数据已经被KO了,而这个问题不仅仅是影响使用这个名字的玩家,而是和他一起游戏过的玩家也会出现数据腰斩的情况,所以这个问题必须要解决。

在网上搜不到相关的文章,对特殊表情符号的处理而又是少之又少,没什么有价值的参考的话,那就自己来一下吧,首先我可以想到的方案:

 

  1. 把特殊表情符号替换掉,或者屏蔽掉
  2. 看看能不能转换一下编码
  3. 看看能不能换一种加解密

第一种情况,体验太不好了,在大厅明明能把表情显示出来,但是战绩却看不到?不行。第三种呢,貌似很大工程,这个以后在探讨。比较适合的,简便的应该是第二种了,直接在数据库上面操作,好了,现在开始动数据库吧。

 

我上网搜一下utf-8和utf-8mb4的区别,这个是肯定有详细的文案可以查看的。

送上地址:http://blog.xieyc.com/utf8-and-utf8mb4/         摘要:

二、为什么会有UTF8MB4?

既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

 

 

三、扩展阅读:UTF-8编码

理论上将, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。关于UTF编码,请阅读《常见编码总结》一文。

而utf8 则是 Mysql 早期版本中支持的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。这可能是因为在MySQL发布初期,基本多文种平面之外的字符确实很少用到。而在MySQL5.5.3版本后,要在 Mysql 中保存 4 字节长度的 UTF-8 字符,就可以使用 utf8mb4 字符集了。例如可以用utf8mb4字符编码直接存储emoj表情,而不是存表情的替换字符。为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。诚然,对于 CHAR 类型数据,使用utf8mb4 存储会多消耗一些空间

-----------------------------------------------------------------------------------------------

 

上面说的很清楚:utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情

这下就应该选对方案了,一切都是从打印出解密后的字符的长度引发的思考。

转载于:https://www.cnblogs.com/liweijian/p/8920104.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

约瑟夫环问题

编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开 始报数,报到m时停止报数…

删除数据清理oracle表空间,oracle数据库删除无用表空间及数据文件过程

应用场景:html数据库服务器A下的一张数据库表重建过,而且数据已经迁移到新表空间下,现遗留了一些原有的表空间数据文件在服务器上,耗费资源,如图所示:linux 原数据库表对应的数据文件:sql迁移后…

mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换

动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换。最近几个网友都提到这个需求&#…

2020年中国面向人工智能“新基建”的知识图谱行业白皮书

全文共计1379字,预计阅读时间8分钟来源 | 艾瑞咨询(经授权转载)编辑 | 蒲蒲日前,认知智能国家重点实验室&艾瑞咨询联合发布《2020年面向人工智能“新基建”的知识图谱行业白皮书》。白皮书从善政、惠民、兴业、智融四个部分对…

JSP 简介(转载)

什么是Java Server Pages? JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合H…

一元多项式的建立及加减

#include<stdio.h> #include<stdlib.h> typedef struct { int x; int y; struct *next; }node; void create1(node **phead,int i,int n) 一元多项式的建立 { int a,b; node *p1, *p2, *q; p2 *phead; p1 NULL; …

oracle中的in函数,Oracle中In函数的使用

SQL: "IN" FunctionThe IN function helps reduce the need to use multipleORconditions.译&#xff1a;IN函数有助于减少OR条件的复合使用。The syntax for the IN function is:译&#xff1a;IN函数的语法&#xff1a;SELECT columnsFROM tablesWHERE column1 in …

海尔对话 Unity:作为数字转型的高阶形态,数字孪生发展前景不可逆

来源&#xff1a;数字化企业作为信息化发展到一定程度的必然结果&#xff0c;数字孪生正成为人类解构、描述和认识真实世界和虚拟世界的新型工具。从发展态势来看&#xff0c;数字孪生不仅是全新信息技术发展的新焦点&#xff0c;也是各国实现数字化转型的新抓手&#xff0c;还…

js整体缩小网页_SEO网页优化的原则是什么?

SEO网页优化的原则是什么?SEO优化对于网页的排名是非常重要的&#xff0c;排名高低直接影响到流量和转化&#xff0c;那么怎么优化呢&#xff0c;SEO网页优化的原则是什么?下面小编来告诉你SEO网页优化的原则。1、不要抄袭。因为独特的内容是所有搜索引擎都喜欢的&#xff0c…

Python基本数据类型以及字符串

基本数据类型 数字 int &#xff0c;所有的功能&#xff0c;都放在int里 a1 123 a1 456 - int 将字符串转换为数字 a "123" print(type(a),…

计蒜客 跳跃游戏

给定一个非负整数数组&#xff0c;假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。 例如&#xff1a;A [2,3,1,1,4]A[2,3,1,1,4] 能够跳跃到最后一个下标&#xff0c;输出true&#xf…

php 面相对象设计,PHP面向对象设计的规范

1.职责过程化的编码&#xff0c;控制代码的职责是判断文件格式&#xff0c;它判断两次不是一次。面向对象的编码&#xff0c;父类的职责是提供规范&#xff0c;判断格式也只有一次&#xff0c;并且不考虑细节。2.内聚内聚是一个模块内部各成分之间相关程度的度量。如果组件职责…

蒲慕明:今人眼中的大脑之美 | 书评

圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y Cajal, 1852-1934&#xff09;来源&#xff1a; 知识分子撰文&#xff1a;蒲慕明现代神经科学起源于十九世纪末期&#xff1b;圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y&#xff09;的神经解剖学研究和他提出的神经元理…

python成绩转换、百分制到五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...

展开全部编码思路&#xff1a;申明两个变量: 成绩cj为 浮点数float 且 取值范围为 [0,100] 闭区间内; pf为字62616964757a686964616fe58685e5aeb931333431353262符类型&#xff0c;接收最终分数评级的字母A,B,C,D,E中的一个。引导用户输入100分制的分数&#xff0c;并用cj接收…

数据库临时表空间设置

1、查看临时表空间 &#xff08;dba_temp_files视图&#xff09;&#xff08;v_$tempfile视图&#xff09;select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files;select status,enabled, name, bytes/1024/1024 file_size from v_$…

一元多项式的加减以及求导

采用链式存储结构&#xff0c;将两个线性链表表示的一元多项式相加减&#xff0c;求导并输出。 #include<stdio.h> #include<stdlib.h>typedef struct lnode{int coef; //系数 int index; //指数struct lnode *next; }node;node *Create() //头插法建立一元…

oracle 驱动表提示错误代码,oracle驱动表以及如何确定驱动表

驱动表普遍认为是由SQL语句的写法决定的&#xff0c;简单的说&#xff0c;就是FROM语句后面的表列表中的最后一个。由于SQL语句是从后向前进行分析&#xff0c;Oracle会根据FROM语句从后到前将各个表依次连接起来。SQL> CREATE TABLE T1 AS SELECT * FROM USER_TABLES;表已创…

sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞&#xff0c;攻击者可利用该漏洞在受影响设备上远程执行代码。攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来触发此漏洞。“Sqlite3 3.26.0的窗口函数&#xff08;Window_Function&#xff09;中存在可…

构建未来情报体系—— AI及大数据时代情报分析人员的战略价值

知远战略与防务研究所 沐俭/编译来自&#xff1a;美国战略与国际问题研究中心网站【知远导读】本篇推送编辑节选自美国战略与国际问题研究中心&#xff08;CSIS&#xff09;技术与情报专项研究小组撰写的一篇利用新兴科技提高情报分析人员的战略情报分析能力的文章&#xff0c;…

B1015/A1062 . 德才论 (25)

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;与其得小人&#xff0…