关于表情符号与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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

中国的自动驾驶到底发展到了什么程度?

来源:面包板社区中国在自动驾驶汽车(AV)领域投入了大量资金,计划大力发展汽车工业这一新兴领域,包括技术、初创企业、测试、法律法规和部署等各个方面。图1:在百度世界2020大会上,百度展示了其全…

数据挖掘算法_技术分享|大数据挖掘算法之KNNk近邻算法

程一舰数据技术处K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。其基本…

岩板铺地好吗_别人都说岩板好,我笑他人乐太早

若说岩板是陶瓷行业目前最火爆的产品,相信没有人会睁眼说瞎话表示反对。据统计,目前国内已建成的岩板生产线已有55条,计划在下半年建成/投产的岩板生产线已有17条。照此势头发展下去,国内岩板生产线的条数在2021年将逼近100条&…

人工智能和自然智能能否交汇?李飞飞对话斯坦福神经生物学教授Bill Newsome

作者:SHANA LYNCH机器之心编译编辑:张倩计算在神经科学中扮演了什么角色?在分子水平上理解大脑能否带来更好的神经网络?人工智能和自然智能之间是否存在一道无法逾越的鸿沟?会不会出现一个研究智能的统一框架&#xff…

spring(三)-事务管理

1、 Spring事务管理 事务管理:本质是使用spring管理事务,完成数据库对于事务的支持。 事务:一系列对数据库操作的集合,一个操作错误,所有都必须回滚,其特点是acid。 (1)事务并发存在…

思科nat配置实例_Cisco ASA 5520(8.2.4)配置企业内网案例

思科防火墙ASA5520 外观网络拓扑图如下内网 网段 192.168.2.0/24公网IP地址 118.25.235.100公网IP地址网关:118.25.235.1.1防火墙内网IP:192.168.2.1/24配置步骤:1、基本配置及配置内外网接口conf thostname ASAFW #设置主机名enable secret pass123 #设置特权密码c…

刘伟:什么是智能人机交互?

本文来自刘伟科学网博客北京邮电大学 刘伟这是一个非常有趣的问题,既涉及智能又牵扯人机交互,更重要的是两者之间的联系。如果把人机交互看成脖子以下,即生理与物理之间的相互作用(如视域、听域、可达域、舒适域)的话&…

警方建立了一个人工智能来预测暴力犯罪,它有严重缺陷

来源:机器学习研究组订阅号在英国,有一个被称为“最严重暴力”(简称MSV,即Most Serious Violence)的预测系统,这个预测系统归属于国家数据分析解决方案(NDAS)项目。过去两年&#xf…

大数据应用开发1——配置基础环境

一、基础环境配置 1.配置虚拟网络 1.1、点击1、编辑2和3, 1.2、点开4,编辑网关 2、配置虚拟机环境 1.1、安装一台虚拟机,使用root用户登录,打开终端 1.2修改主机名 终端输入: vim /etc/hostname使用vim编辑/etc/ho…

交叉科学部如何建?基金委:要做好这4点

来源:科学网微信公号 11月29日,国家自然科学基金委员会(以下简称自然科学基金委)交叉科学高端学术论坛在北京召开。第十二届全国政协副主席、中国科协名誉主席、中国科学院院士韩启德,自然科学基金委原主任、中国科学院…

智能三定律(1),提出智能三条定律的背景和原因

前言:智能是重要的智能科学基础概念,如何解读它也一直存在争议,2005年以来,通过对互联网进化规律、标准智能模型与AI智商评测的研究,我们获得了关于智能的新启发与新思考,2020年5月,智能定律初探…

2017年网易校招题 末尾0的个数

题目描述 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n 10; n! 3628800,所以答案为2输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 示例1输入 10 输出 2 思路:要统计末尾0的个数,只需要统…