Python:一图看懂Python2还是Python3的编码
无论是Python2还是Python3,都使用unicode作为内存编码,简称内码。保存在python解释器内存中的文本,输出到屏幕、编辑器,或者保存成文件的时候,都要将内码转换成utf8或者gbk等编码格式;同样,python解释器从输入设备接收文本,或者从文件读取文本的时候,都要将utf8或者gbk等编码转换成unicode编码格式。因此,无论是Python2还是Python3,想要在unicode、utf8、gbk等编码格式之间转换的话,下图是通用的:
我们之所以会产生困惑,是因为py2和Python3给这些编码格式指定了令人困惑的名字。Python2的字符串有两种类型:unicode类型和str类型。Python2的unicode类型就是unicode编码,Python2的str类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。Python3的字符串也有两种类型:bytes类型和str类型。Python3的str类型就是unicode编码,Python3的bytes类型泛指除unicode编码之外的所有编码,包括ascii编码、utf8编码、gbk编码、cp936编码等。同样是str类型,在Python2和Python3中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。
接下来,我们实战演练一下。
s = 'abc天圆地方'
type(s)
len(s)
7
s
'abc天圆地方'
print(s)
abc天圆地方
s.encode('unicode-escape')
b'abc\u5929\u5706\u5730\u65b9'
不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是unicode编码,也就是py3的,其长度就是字符数量,不是字节数。我们把unicode字符串’abc天圆地方’转成utf8编码:
s_utf8 = s.encode('utf8')
type(s_utf8)
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天圆地方'
utf8编码就是bytes类型(字节码),长度就是字节数量。我们把unicode字符串’abc天圆地方’转成gbk编码:
s_gbk= s.encode('gbk')
type(s_gbk)
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天圆地方'
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 "", line 1, in
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天圆地方'
看以看出,不同编码的字节码可以连接,但一般不能解码成unicode(字符串),除非使用ignore参数。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么大部分的 iOS开发者成为不了架构师呢?
前言: 小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL)。 所以,架构师在广大码农中的占比大概平均不到 10%。 而架构师也可以分为初级、中级、高级三档,江湖上真正高水平的软件架构师就更少了。 所以,大部分(超过九成的)iOS 码农干上许多年,还是做不了架构师,这是什么原因造成的呢? 1:码农分为真的能写代码的,以及自认为能写代码的。 2:真的能写代码的码农又分为自认为写的不错的,以及真的还不错的。 3:真的能写不错代码的码农又分为会钻研会不断优化的,以及安于现状的。 4:会钻研的码农又分为喜欢广度了解新技术蜻蜓点水的,以及深入钻研用到知识的。 了解广度的码农又有少部分愿意深入某些技术,喜欢深入研究的又往往缺乏广度知识。 推荐阅读:iOS开发——BAT面试题合集(持续更新中) 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长! . 5:极少深度广度都关注的码农又分为为技术而技术和为业务而技术的。 纯为技术而技术的码农在国...
- 下一篇
Python学习路线图:112天系统学习,你也能成大神!(附图)
学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习。这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Python是一种编程语言 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。用Python完成项目,编写的代码量更少,代码简短可读性强,团队协作开发时读别人的代码速度会非常快,使工作变得更加高效。优雅做开发不再是梦! Python语言应用广泛编程语言排行榜前五 根据TIOBE最新排名,Python已超越C#,与Java,C,C++成为全球前5大流行编程语言之一。从云端、客户端,到物联网终端,python应用无处不在。从国内的百度、阿里、腾讯、网易、新浪,豆瓣,到国外的谷歌、NASA、YouTube、Facebook,Python的企业需求逐步上升,各公司都在大规模使用Python完成各种任务。 Python编程简单直接适合快速开发 Python是美国主流大学受欢迎的入门编程语言,诞生至今已经过25个年头。相对于其他语言,它更加易学、易读,非常适合...
相关文章
文章评论
共有0条评论来说两句吧...