Python实现模拟锟斤拷等各类乱码详解
作者:小小明-代码实体 发布时间:2022-08-23 04:31:22
锟拷码和口字码
说到乱码问题就不得不提到锟斤拷,这算是非常常见的一种乱码形式,那么它到底是经过何种错误操作产生的呢?下面我们一步步探究。
看一个基本示例:
"��".encode("u8").decode("gbk")
'锟斤拷'
我们将�字符以UTF-8编码后,以GBK编码解码就可以得到 锟斤拷 的乱码。
那么为什么 锟斤拷 为什么如此常见呢?这是因为大部分编程语言在使用UNICODE系列的编码去解码时,会将不识别的字节编码为0xFFFD(65533)即�字符表示未知字符进行占位:
"\uFFFD"
'�'
注意:UNICODE系列包括UTF-8、UTF-16、UTF-32编码,一般UNICODE编码指UTF-16编码。在python中unicode_escape编码表示UNICODE编码的的转义形式:
"\uFFFD".encode("unicode_escape").decode()
'\\ufffd'
对于Python,默认情况下解码碰到未知字符时会直接抛出异常,但是如果设置errors参数为replace时,则会将未知字符解码为�占位。
将汉字用GBK编码:
"小小明".encode("gbk")
b'\xd0\xa1\xd0\xa1\xc3\xf7'
将上述编码结果用UTF-8编码解码,并设置为替换模式:
"小小明".encode("gbk").decode("u8", "replace")
'СС��'
0xd0a1被解码成С,但是0xc3和0xf7无法被UTF-8编码识别,只能用占位符�替换,于是就得到了上面的结果。
此时我们再编码并解码:
"小小明".encode("gbk").decode("u8", "replace") \
.encode("u8").decode("gbk", "replace")
'小小锟斤拷'
这是因为�被编码成了0xEFBFBD
"��".encode("u8")
b'\xef\xbf\xbd\xef\xbf\xbd'
而0xEFBFBDEFBFBD被GBK解码时,正好就是锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
上述以�为主的乱码字符就是口字码,原因是以UTF-8编码读取了GBK编码的中文。
而锟拷体则是大部分都是锟斤拷的全中文字符,原因是用GBK编码读取了UTF-8编码的口字码中文。
古文码与问句码
问句码产生的核心原因在于GBK对于无法编码的字符会使用?填充:
"�😑".encode("gbk", "replace")
b'??'
古文码则与前面的口字码产生原因相反,使用GBK编码读取以UTF-8编码的中文:
"小小明".encode("u8").decode("gbk", "replace")
'灏忓皬鏄�'
此时的 灏忓皬鏄 就非常像古文,gbk解码对于不识别的字节也使用�占位。
此时gbk编码对于�编码失败,使用?替代:
'灏忓皬鏄�'.encode("gbk", "replace")
b'\xe5\xb0\x8f\xe5\xb0\x8f\xe6\x98?'
此时再用UTF-8解码就得到了问句码:
b'\xe5\xb0\x8f\xe5\xb0\x8f\xe6\x98?'.decode("u8", "ignore")
'小小?'
不过问句码只在原始字符串为奇数时产生,如果原始字符串长度为偶数,使用上述编码方式则可以原样还原字符串:
"小小明月".encode("u8").decode("gbk", "replace") \
.encode("gbk", "replace").decode("u8", "ignore")
'小小明月'
这样说明只要我们将原始汉字字符串填充到偶数,就可以使用古文码实现可逆的数据传输,而锟拷体则是一种不可逆的乱码。
符号码和拼音码
还有两种可逆的乱码,我们先看看符号码:
"小小明".encode("u8").decode("iso8859-1")
'å°\x8få°\x8fæ\x98\x8e'
像这种大部分字符为各种符号的乱码就称为符号码,符号码可以直接还原为原始的文本:
'å°\x8få°\x8fæ\x98\x8e'.encode("iso8859-1").decode("u8")
'小小明'
再看看拼音码:
"小小明".encode("gbk").decode("iso8859-1")
'ССÃ÷'
这种大部分字符都是带有声调的字母称为拼音码,同样可以直接还原:
'ССÃ÷'.encode("iso8859-1").decode("gbk")
'小小明'
总结
名称 | 示例 | 特点 | 原因 |
---|---|---|---|
口字码 | СС�� | 大部分字符是问号小方块 | UTF-8解码GBK编码的中文 |
锟拷体 | 锟斤拷小小锟斤拷学习锟斤拷 | 全中文字符,大部分都是"锟斤拷"这几个字符 | GBK解码UTF-8编码的口字码 |
古文码 | 灏忓皬鏄庢湀 | 大部分都是生僻字,像古文 | GBK解码UTF-8编码的中文汉字 |
问句码 | 小小? | 字符串长度为奇数时,结尾为问号 | GBK遇到不能编码的字符时填充 |
符号码 | 好好å\xad¦å¤©å¤©å\xad¦ | 大部分字符为各种符号 | ISO8859-1编码解码UTF-8编码的中文汉字 |
拼音码 | ºÃºÃѧϰÌìÌìÏòÉÏ | 大部分字符都是带有声调的字母 | ISO8859-1编码解码GBK编码的中文汉字 |
来源:https://xxmdmst.blog.csdn.net/article/details/125646802


猜你喜欢
- 什么是Selenium先带领大家学习下Selenium的基本概念吧。Selenium主要用于web应用程序的自动化测试,但并不局限于此,它还
- 官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况
- 本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴。具体方法如下:对一个列表,
- 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有 创建计算列导致查询
- 一、直接导入模块import 模块名优点:干净直接import sysprint(sys.path)import os # os是一个模块i
- 案例场景 今天在线上发现一个问题,由于监控没有覆盖到,某台机器的磁盘被写满了,导致线上My
- 一、JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON建
- 注意,要看懂这里,必须具备简单的Python数据分析知识,必须知道matplotlib的简单使用!例1:plt.subplot(221) #
- 在执行iisapp.vbs时,可能会提示如下错误:Windows Script Component - file://C:WINDOWSsy
- 我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请
- 使用本Activation code需要jetbrains-agent支持!插件Activation code:06KU174Y5C-eyJ
- 操作步骤进入命令行环境。我使用的是conda。有两种方式进入命令行。方法1:通过anconda navigator界面,选择environm
- chr(13) 是一个回车Chr(10) 是一个换行符chr
- 总说由于pytorch 0.4版本更新实在太大了, 以前版本的代码必须有一定程度的更新. 主要的更新在于 Variable和Tensor的合
- 简单asp加载access数据库,并生成XML,然后再将XML数据加载进LIST组件范例学习。演示:http://www.taoshaw.c
- 搭建环境:操作系统:Win10 64bitPython版本:3.7Pycharm:社区免费版一、Python3.7安装下载链接:官网http
- Python提供了一些内建函数用于基本对象类型:cmp(),repr(),str(),type()和等同于repr()的('
- 使用SQL Server事件探查器工具,你可用一个捕获到的跟踪来收集有关服务器的重要信息。与索引优化向导(Index Tuning Wiza
- Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Guido van Rossum于 * 底发明,第一个
- 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个。诸如此类的问