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

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

  1. 分析6千万条GitHub帖子,发现你的工作状态与表情符号强相关

    作者 | 凌霄 出品 | AI科技大本营(ID:rgznai100) 新冠疫情使得远程办公的人数大幅度增加,然而,当越来越多的人远程工作时,人们的情绪和心理健康状态也难以通过日常面对面的交流来观察,雇 ...

  2. 360的困兽之斗——重新探讨奇虎商业模式

    360的困兽之斗--重新探讨奇虎商业模式 作者: 汉景奎  来源: 雪球  发布时间: 2013-01-25 18:24  阅读: 2080 次  推荐: 23   原文链接   [收藏]   本文作 ...

  3. Emoji表情符号兼容方案(适用ios,android,wp等平台)

    http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...

  4. 表情符号mysql utf8mb4_mysql utf8mb4与emoji表情

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  5. 6000万条GitHub帖子告诉你:工作状态与表情符号强相关

    作者 | 凌霄 出品 | AI科技大本营(ID:rgznai100) 随着远程办公人数大幅度增加,然而,当越来越多的人远程工作时,人们的情绪和心理健康状态也难以通过日常面对面的交流来观察,雇主们也就无 ...

  6. Emoji表情符号兼容方案

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  7. 适用ios,android,wp等平台手机emoji表情符号兼容方案

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  8. Emoji表情符号兼容方案(转)

    一 什么是Emoji     emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手 ...

  9. [ios2]Emoji表情符号兼容方案 【转】

    Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji ...

最新文章

  1. python的难点在哪里_自己写的Python答案,不知道错在哪儿希望能被告知问题在哪儿和答案...
  2. jsp中简易版本的图片上传程序
  3. python 基础笔记十一 - random模块
  4. java中不带package和带package的编译运行方式
  5. 【C语言】输入三个正整数a,b,c,求最大值,要求定义一个计算最大值的函数max(a,b),返回a,b的值...
  6. asp.net怎么实现按条件查询_Display Posts : 按条件显示WordPress文章的最强插件
  7. spss和python stata matlab_(SPSS,Matlab,stata,Python)相关性?
  8. LeetCode34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
  9. 百万数据插入 java sql mysql
  10. 菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven)
  11. Julia : HDF5、JLD2库、group、dataset
  12. 2023年长安大学外国语言文学考研考情与难度及上岸前辈备考经验
  13. SQL server 2008 安装教程
  14. JS获取浏览器高度和宽度
  15. 【每日随笔】飞书云文档使用 ( 注册飞书云文档账号 | 创建云文档 | 分享云文档 )
  16. 微信小程序开发(十五)小程序使用scrollview实现滚动导航栏
  17. html图片铺底代码,梦幻西游底部师徒四人动态图
  18. Phalcon 上传文件
  19. 第一性原理计算软件攻略-利用VESTA绘制差分电荷密度图解
  20. 【WSAGetLastError】WSAGetLastError返回值

热门文章

  1. android转流媒体,android 4.4中的流媒体渲染过程
  2. 天池 在线编程 最频繁出现的子串(字符串哈希)
  3. LeetCode 1684. 统计一致字符串的数目(哈希)
  4. LeetCode 1153. 字符串转化(哈希)
  5. LeetCode 291. 单词规律 II(回溯)
  6. LeetCode 635. 设计日志存储系统(map)
  7. LeetCode MySQL解题目录
  8. 修改dts后重编译_「正点原子FPGA连载」第二十章另一种方式编译ZYNQ镜像
  9. 怎么读取matlab程序包,Nifti程序包,用于写入,读取和处理医学影像,适用于MATLAB
  10. java对象持久化技术_Java对象持久化技术Hibernate 一