最近对于Python2和Python3的编码和解码比较困惑,在知乎上面咨询了依云大神后对Python的编码和解码逐渐清晰起来,
在此把个人理解结合大神的指点分享一下,如下内容仅代表个人观点,不排除有错误!
首先需要明白encode == 编码,decode == 解码,encode就是把逻辑上的字符变成二进制数据,以便存储和传输.
(至于编码前和解码后的字符是怎么存储的,是Python的内部实现,只有 Python 自己需要操心,你不用管;
就像你不用管整数在 Python 内存里长什么样一样,但是你把整数存起来或者传输到网络上时;
你就得考虑,是转成十进制字符串表示呢,还是转成32位无符号小端序表示呢,还是64位有符号网络序表示呢……)
## Python 2.x非常特殊和混乱,默认的字符串(str)对象是ascii编码,要支持非英文字符串时需要指定为unicode编码
python2.x中字符串有str和unicode两种类型:
str1 = ‘my name is Ray‘ # ascii字符串
ustr1 = u‘我的名字是Ray‘ # unicode字符串
Python2中的解码与编码: 非unicode编码str在解码(decode)为unicode后才能encode为其它编码.
str1.decode(‘ascii‘) # ascii ==> unicode
str1.decode(‘ascii‘).encode(‘utf-8‘) # unicode ==> utf-8
关于ascii\unicode\utf-8编码的理解:
1.ascii和unicode编码是两个不同的编码标准,而utf-8是一种针对Unicode的可变长度字符编码,又称万国码.
2.ascii编码是1个字节(2^8),而unicode编码通常是2个字节(2^16),一字节是8bit,但是utf-8编码一般是3个字节.
3.ascii编码只支持英文字母和数字及一些符号,unicode编码可以支持全世界的字符,中文和拉丁文等.
4.编程中广泛使用的utf-8可变长字符编码,对于纯英文字符在utf-8编码中还是和ascii编码一样只占用1字节,非英文字符才占用3个字节.
______________________________________________________________
| 字符 | ASCII | Unicode | UTF-8 |
---------------------------------------------------------------------------------------------------
| A | 01000001 | 00000000 01000001 | 01000001 |
---------------------------------------------------------------------------------------------------
| 中 | X | 01001110 00101101 | 11100100 10111000 10101101 |
---------------------------------------------------------------------------------------------------
5.内存读写信息是以byte为单位.
__________________________________________
| string |
--------------------------------------------------------------------
| char | char | char |
--------------------------------------------------------------------
| byte | byte | byte | byte | byte | byte |
--------------------------------------------------------------------
## Python 3.x默认的字符串(str)对象是unicode编码,可以使用sys.getdefaultencoding()查看.
Python3中关于str和byte的理解:
如上面所说encode == 编码,decode == 解码,encode就是把逻辑上的字符变成二进制数据,以便存储和传输.
Python3中的str是字符串数据对象不能decode,byte是二进制数据对象同理也不能encode;
str调用encode方法产生一个编码后的byte类型(二进制)的字符串,而byte类型的字符串支持解码(decode)操作转换回str类型.
所以在io模块里面有StringIO和BytesIO之分,内存读写二进制数据使用BytesIO,内存读写字符串时使用StringIO.
# str object
s = "example"
# bytes object
b = b"example"
# str to bytes
bytes(s, encoding = "utf8")
# bytes to str
str(b, encoding = "utf-8")
# an alternative method
# str to bytes
str.encode(s)
# bytes to str
bytes.decode(b)
原文:http://www.cnblogs.com/raykuan/p/5727687.html