py2和py3编码问题

python2

py2默认的编码是ascii, ascii只支持英文字符

In [2]: sys.getdefaultencoding()
Out[2]: 'ascii'

In [4]: a = '你好'

In [5]: a
Out[5]: '\xe4\xbd\xa0\xe5\xa5\xbd'  # 输出是十六进制的内存地址, 但其实还是bytes类型

In [6]: type(a)     # 类型是str, 其实就是bytes
Out[6]: str

In [7]: b = 'hello'

In [8]: b
Out[8]: 'hello'

In [9]: type(b)
Out[9]: str

In [11]: a1 = a.decode('utf-8')  

In [12]: a1
Out[12]: u'\u4f60\u597d'    # 将bytes二进制按utf-8字符集解码

In [13]: type(a1)
Out[13]: unicode        # 变成了py2独有的unicode类型

In [16]: sys.getsizeof(a)  # bytes类型的你好
Out[16]: 43  # 字节大小

In [17]: sys.getsizeof(a1) # 解码后的 你好
Out[17]: 54

In [19]: b1 = b.decode('utf-8')

In [20]: b1
Out[20]: u'hello'

In [22]: sys.getsizeof(b)   # bytes类型占的字节数少
Out[22]: 42 

In [23]: sys.getsizeof(b1)  # unicode占字节数多
Out[23]: 60

注意:python2的basestring和str是不同的, basestring是包含了bytes和unicode两种类型, 而str就是bytes类型.

print isinstance(u'aa', basestring) # True
print isinstance('aa', basestring) # True
print isinstance(u'aa', str) # False
print isinstance('aa', str) # True

python3

py3默认的编码是unicode, utf-8字符集

In [1]: import sys

In [2]: sys.getdefaultencoding()
Out[2]: 'utf-8'

In [3]: a = '你好'

In [4]: a
Out[4]: '你好'

In [5]: type(a)     # py3的str就是str
Out[5]: str 

In [6]: a1 = a.encode('utf-8')

In [7]: a1
Out[7]: b'\xe4\xbd\xa0\xe5\xa5\xbd'  # 按默认编码格式编码后才是bytes

In [8]: type(a1)
Out[8]: bytes

Python平凡之路
Python学习的记录分享,欢迎大家批评指正。 走弯路让你见识更广,走直路让时复更低。

没得啥, 慢慢学吧

19 声望
2 粉丝
0 条评论
推荐阅读
MySQL常用语法命令及函数
创建数据库 create database 数据库名; 查看数据库 show databases; 选择数据库 use 数据库名; 删除数据库 drop database 数据库名; 创建表 create table 表名(属性名1 数据类型 ,属性名2 数据类型。。。。); 查...

Alei_杨磊阅读 1.7k

基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 3.9k评论 3

滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许4阅读 2.3k

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
Python之如何优雅的重试
为了避免偶尔的网络连接失败,需要加上重试机制,那么最简单的形式就是在对应的代码片段加一个循环,循环体里使用异常捕获,连接成功时退出循环,否则就重复执行相关逻辑,此时修改之后的函数f如下

Harpsichord12073阅读 7.3k

Linux终端居然也可以做文件浏览器?
大家好,我是良许。在抖音上做直播已经整整 5 个月了,我很自豪我一路坚持到了现在【笑脸】最近我在做直播的时候,也开始学习鱼皮大佬,直播写代码。当然我不懂 Java 后端,因此就写写自己擅长的 Shell 脚本。但...

良许1阅读 2.1k

没得啥, 慢慢学吧

19 声望
2 粉丝
宣传栏