版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xufive/article/details/102726739
无论是py2还是py3,都使用unicode作为内存编码,简称内码。保存在python解释器内存中的文本,输出到屏幕、编辑器,或者保存成文件的时候,都要将内码转换成utf8或者gbk等编码格式;同样,python解释器从输入设备接收文本,或者从文件读取文本的时候,都要将utf8或者gbk等编码转换成unicode编码格式。因此,无论是py2还是py3,想要在unicode、utf8、gbk等编码格式之间转换的话,下图是通用的:
我们之所以会产生困惑,是因为py2和py3给这些编码格式指定了令人困惑的名字。py2的字符串有两种类型:unicode类型和str类型。py2的unicode类型就是unicode编码,py2的str类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。py3的字符串也有两种类型:bytes类型和str类型。py3的str类型就是unicode编码,py3的bytes类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。同样是str类型,在py2和py3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。

接下来,我们实战演练一下。

>>> s = 'abc天圆地方'
>>> type(s)
<class 'str'>
>>> len(s)
7
>>> s
'abc天圆地方'
>>> print(s)
abc天圆地方
>>> s.encode('unicode-escape')
b'abc\\u5929\\u5706\\u5730\\u65b9'
1
2
3
4
5
6
7
8
9
10
11
不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是unicode编码,也就是py3的<class ‘str’>,其长度就是字符数量,不是字节数。我们把unicode字符串’abc天圆地方’转成utf8编码:

>>> s_utf8 = s.encode('utf8')
>>> type(s_utf8)
<class 'bytes'>
>>> len(s_utf8)
15
>>> s_utf8
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'
>>> print(s_utf8)
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9'
>>> s_utf8.decode('utf8')
'abc天圆地方'
1
2
3
4
5
6
7
8
9
10
11
utf8编码就是bytes类型(字节码),长度就是字节数量。我们把unicode字符串’abc天圆地方’转成gbk编码:

>>> s_gbk= s.encode('gbk')
>>> type(s_gbk)
<class 'bytes'>
>>> len(s_gbk)
11
>>> s_gbk
b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> print(s_gbk)
b'abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> s_gbk.decode('s_gbk')
'abc天圆地方'
1
2
3
4
5
6
7
8
9
10
11
gbk编码也是bytes类型(字节码),长度也是字节数量。我们再来看看,不同编码的字节码能否连接:

>>> ss = s_utf8 + s_gbk
>>> ss
b'abc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd'
>>> ss.decode('utf8')
Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    ss.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 18: invalid continuation byte
>>> ss.decode('gbk')
'abc澶╁渾鍦版柟abc天圆地方'
>>> ss.decode('utf8', 'ignore')
'abc天圆地方abcԲط'
>>> ss.decode('gbk', 'ignore')
'abc澶╁渾鍦版柟abc天圆地方'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
看以看出,不同编码的字节码可以连接,但一般不能解码成unicode(字符串),除非使用ignore参数。

后记
近期有很多朋友通过私信咨询有关python学习问题。为便于交流,我创建了一个名为“python程序员进阶之路”的微信群,面向python初学者,为大家提供一个交流学习的平台。我也会尽我所能在群里为大家提供技术支持。欢迎有兴趣的同学扫我微信码,我带你入队。
————————————————
版权声明:本文为CSDN博主「天元浪子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xufive/article/details/102726739

一图看懂py2/py3编码相关推荐

  1. 一图看懂软件缺陷检查涉及的内容

    摘要:软件安全检查极具挑战性,目前的主要理论和技术研究都是欧美完成的.希望有更多的软件开发人员能够投入到这个领域,为国产的静态软件分析做出贡献. 本文分享自华为云社区<一图看懂软件缺陷检查涉及的 ...

  2. 一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, 资料整理+笔记(大全)

    本文由 大侠(AhcaoZhu)原创,转载请声明. 链接: https://blog.csdn.net/Ahcao2008 一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, ...

  3. 一图看懂 docx 读取、查询、修改 Ms Word docx 文件, 资料整理+笔记(大全)

    本文由 大侠(AhcaoZhu)原创,转载请声明. 链接: https://blog.csdn.net/Ahcao2008 一图看懂 docx 读取.查询.修改 Ms Word docx 文件, 资料 ...

  4. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  5. 一张图看懂图像识别算法发展历史

    一张图看懂图像识别算法发展历史

  6. 一图看懂新一代人工智能知识体系大全

    来源:财经头条 摘要:人工智能的发展离不开基础支持层和技术层,基础支持层包括大数据.计算力和算法:技术层包括计算机视觉.语音识别和自然语言处理.人工智能的技术本质是什么,本文会详细分析. 人工智能的发 ...

  7. 一图看懂windows11新功能

    [欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 微软Windows 11操作系统还没有正式推出,不过加入"预览体验计划"可以抢先体 ...

  8. sdn体系的三个平面_十张图看懂SDN与NFV的区别与联系?

    原标题:十张图看懂SDN与NFV的区别与联系? 专业的人说的很准确但是普通人难以理解,常常记不住,分不清,不专业的人往往又说的差点意思.无意间,笔者在领英上看到一个介绍SDN/NFV区别的公开文档,内 ...

  9. 一图看懂hadoop分布式文件存储系统HDFS工作原理

    一图看懂hadoop分布式文件存储系统HDFS工作原理 转载于:https://www.cnblogs.com/AlexQY/p/9856477.html

最新文章

  1. ORA-00942:表或视图不存在(低级错误)
  2. php一句话过狗,整理的最新WebSHell (php過狗一句話,過狗菜刀,2016過狗一句話,2016php免殺一句話)...
  3. Mysql修改字段长度
  4. 制作网页版Excel表
  5. python qq群_用Python玩转QQ群论坛
  6. (亲测可用)基于matlab的用自写函数来实现图像的灰度处理sobel canny算子边缘检测
  7. Microbiome:鸡肠道微生物宏基因集的构建(张和平、魏泓、秦楠点评)
  8. 【Uplift】因果推断基础篇
  9. 新浪企业邮箱服务器怎么设置,新浪企业邮箱|手机端设置
  10. SSM框架医院信息管理系统-患者医生考勤管理挂号管理-病房管理-科室管理- (idea开发javaweb-php-asp.netC#-j2ee-springboot)
  11. Pixel2Mesh从单个RGB图像生成三维网格ECCV2018
  12. virtualBox虚拟机之间网络互通设置
  13. Apple developer新的的注册方式
  14. IIS 相关概念(站点、虚拟目录、应用程序池、隔离模式、W3WP.EXE、Web Gargen) 及 IIS 6的ASP.net请求处理过程
  15. java find()_java 之 find 命令
  16. 智慧交通:智慧公路建设探索
  17. Modflow抽水井案例模拟1
  18. 双网卡同时连接内网和外网的解决方案
  19. 在计算机系统内部,汉字的表示方法是采用,工作分析不属于人因工程学主要研究方法。()...
  20. 智慧水务平台解决方案包括哪些内容

热门文章

  1. 经典C语言程序100例之六八
  2. 北交的计算机和北理,北航与北理
  3. 「Self-driving: Perception」多传感器融合之Camera、Lidar 雷达融合
  4. 在 MySQL 中使用 explain 查询 SQL 的执行计划(转自: 数据分析与开发)
  5. Hadoop-rpc调用案例,服务端,客户端代码案例
  6. 第24日:实施质量保证 和 组建项目团队
  7. 2.Cocos2d-x-3.2编写3d打飞机,项目代码总结
  8. 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
  9. websocket 连接本地端口_聊聊 WebSocket,还有 HTTP
  10. 曼尼托巴大学计算机硕士录取要求,曼尼托巴大学硕士