要从乱码字符中反解出原来的正确文字需要对各个字符集编码规则有较为深刻的掌握 。但是原理很简单,这里用最常见的UTF-8被错误用GBK展示时的乱码为例,来说明具体反解和识别过程 。
1、编码
假设我们在页面上看到寰埚睂这样的乱码,而又得知我们的浏览器当前使用GBK编码 。那么第一步我们就能先通过GBK把乱码编码成二进制表达式 。当然查表编码效率很低,我们也可以用以下SQL语句直接通过MySQL客户端做编码工作:
01mysql [localhost] {msandbox} > select hex(convert('寰埚睂' using gbk));02 ------------------------------------- 03| hex(convert('寰埚睂' using gbk)) |04 ------------------------------------- 05| E5BE88E5B18C |06 ------------------------------------- 071 row in set (0.01 sec)复制代码mysql [localhost] {msandbox} > select hex(convert('寰埚睂' using gbk)); ------------------------------------- | hex(convert('寰埚睂' using gbk)) | ------------------------------------- | E5BE88E5B18C | ------------------------------------- 1 row in set (0.01 sec)2、识别
现在我们得到了解码后的二进制字符串E5BE88E5B18C 。然后我们将它按字节拆开 。
Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6
E5 BE 88 E5 B1 8C
然后套用之前UTF-8编码介绍章节中总结出的规律,就不难发现这6个字节的数据符合UTF-8编码规则 。如果整个数据流都符合这个规则的话,我们就能大胆假设乱码之前的编码字符集是UTF-8
3、解码
然后我们就能拿着E5BE88E5B18C用UTF-8解码,查看乱码前的文字了 。当然我们可以不查表直接通过SQL获得结果:
01mysql [localhost] {msandbox} ((none)) > select convert(0xE5BE88E5B18C using utf8);02 ------------------------------------ 03| convert(0xE5BE88E5B18C using utf8) |04 ------------------------------------ 05| 很厉害 |06 ------------------------------------ 071 row in set (0.00 sec)复制代码mysql [localhost] {msandbox} ((none)) > select convert(0xE5BE88E5B18C using utf8); ------------------------------------ | convert(0xE5BE88E5B18C using utf8) | ------------------------------------ | 很厉害 | ------------------------------------ 1 row in set (0.00 sec)常见问题处理之Emoji:
所谓Emoji就是一种在Unicode位于u1F601-u1F64F区段的字符 。这个显然超过了目前常用的UTF-8字符集的编码范围u0000-uFFFF 。Emoji表情随着IOS的普及和微信的支持越来越常见 。下面就是几个常见的Emoji:
文章插图
那么Emoji字符表情会对我们平时的开发运维带来什么影响呢?最常见的问题就在于将他存入MySQL数据库的时候 。一般来说MySQL数据库的默认字符集都会配置成UTF-8(三字节),而utf8mb4在5.5以后才被支持,也很少会有DBA主动将系统默认字符集改成utf8mb4 。那么问题就来了,当我们把一个需要4字节UTF-8编码才能表示的字符存入数据库的时候就会报错:ERROR 1366: Incorrect string value: ‘xF0x9Dx8Cx86’ for column。
如果认真阅读了上面的解释,那么这个报错也就不难看懂了 。我们试图将一串Bytes插入到一列中,而这串Bytes的第一个字节是xF0意味着这是一个四字节的UTF-8编码 。但是当MySQL表和列字符集配置为UTF-8的时候是无法存储这样的字符的,所以报了错 。
那么遇到这种情况我们如何解决呢?有两种方式:升级MySQL到5.6或更高版本,并且将表字符集切换至utf8mb4 。第二种方法就是在把内容存入到数据库之前做一次过滤,将Emoji字符替换成一段特殊的文字编码,然后再存入数据库中 。之后从数据库获取或者前端展示时再将这段特殊文字编码转换成Emoji显示 。第二种方法我们假设用-*-1F601-*-来替代4字节的Emoji,那么具体实现python代码可以参见Stackoverflow上的回答 。
推荐阅读
- 阴阳师尘世之梦玩法介绍 阴阳师彼世之花尘世之梦玩法规则
- sin0是多少
- 阴阳师花合战返场皮肤怎么买 阴阳师花合战客岁花札机制介绍
- pcie4.0和pcie3.0区别详细介绍
- 阴阳师夜行荒河怎么玩 阴阳师夜行荒河玩法奖励介绍
- 脑洞大师115关怎么过
- 巧用自定义形状制作个性梦幻签名
- 阴阳师彼世之花活动介绍 阴阳师彼世之花商店奖励一览
- 阴阳师迷蝶寻迹怎么玩 阴阳师迷蝶寻迹活动玩法介绍