Python实现模拟锟斤拷等各类乱码详解

 更新时间:2023年02月23日 10:24:40   作者:小小明-代码实体  
说到乱码问题就不得不提到锟斤拷,这算是非常常见的一种乱码形式,那么它到底是经过何种错误操作产生的呢?本文我们就来一步步探究

锟拷码和口字码

说到乱码问题就不得不提到锟斤拷,这算是非常常见的一种乱码形式,那么它到底是经过何种错误操作产生的呢?下面我们一步步探究。

看一个基本示例:

"��".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编码的中文汉字

到此这篇关于Python实现模拟锟斤拷等各类乱码详解的文章就介绍到这了,更多相关Python模拟乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3用urllib抓取贴吧邮箱和QQ实例

    python3用urllib抓取贴吧邮箱和QQ实例

    在本篇文章里小编给大家整理了关于python3中运用urllib抓取贴吧的邮箱以及QQ的实例内容,需要的朋友们可以学习下。
    2020-03-03
  • Python进行数据可视化Plotly与Dash的应用小结

    Python进行数据可视化Plotly与Dash的应用小结

    数据可视化是数据分析中至关重要的一环,它能够帮助我们更直观地理解数据并发现隐藏的模式和趋势,本文主要介绍了Python进行数据可视化Plotly与Dash的应用小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Python3 批量扫描端口的例子

    Python3 批量扫描端口的例子

    今天小编就为大家分享一篇Python3 批量扫描端口的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Django提高查询速度的9种方法总结

    Django提高查询速度的9种方法总结

    Django作为一个高度可扩展的Web框架,提供了多种方式来优化数据库查询,本文将介绍一些常用的Django数据库查询优化技巧,需要的可以参考一下
    2023-07-07
  • 再谈Python中的字符串与字符编码(推荐)

    再谈Python中的字符串与字符编码(推荐)

    这篇文章主要介绍了再谈Python中的字符串与字符编码(推荐),具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • Pandas中DataFrame.drop()函数的具体使用

    Pandas中DataFrame.drop()函数的具体使用

    DataFrame.drop是Pandas库中一个非常实用的函数,用于删除 DataFrame中的行或列,本文就来介绍一下Pandas中DataFrame.drop()函数的具体使用,感兴趣的可以了解一下
    2024-07-07
  • Python  中的pass语句语法详析

    Python  中的pass语句语法详析

    这篇文章主要介绍了Python 中的pass语句语法详析,pass是一种空操作(null operation),解释器执行到它的时候,除了检查语法是否合法,什么也不做就直接跳过
    2022-07-07
  • python和opencv实现抠图

    python和opencv实现抠图

    这篇文章主要为大家详细介绍了使用python和opencv实现抠图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • termux中matplotlib无法显示中文问题的解决方法

    termux中matplotlib无法显示中文问题的解决方法

    这篇文章主要介绍了termux中matplotlib无法显示中文问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 分享5个数据处理更加灵活的pandas调用函数方法

    分享5个数据处理更加灵活的pandas调用函数方法

    这篇文章主要介绍了分享5个数据处理更加灵活的pandas调用函数方法,文章基于python的相关内容展开详细介绍,需要的小伙伴可以参考一下
    2022-04-04

最新评论