字符编码介绍:
ASCII定义了从0到127的字符代码,并且允许每个字符存储在一个8位的字节中(实际上,只有其中的7位真正用到)。
例如,ASCII标准把字符'a'映射为整数值97(十六进制中的0x61)
>>> ord('a') #内置ord函数将对应字符转换为ASCII码 97 >>> chr(97) #将对应的ASCII码转化成对应字符 'a' >>> hex(97) #顺便回顾下十六进制 '0x61' >>> bin(97) #二进制 '0b1100001' >>> oct(97) #八进制 '0o141'
编码是根据一个想要的编码名称,把一个字符串翻译为其原始字节形式。
解码是根据其编码名称,把一个原始字节串翻译为字符串形式的过程。
对于Python程序员来说,编码指定为包含了编码名的字符串。Python带有大约100种不同的编码,参见Python库参考可以找到一个完整的列表。
导入encodings模块并运行help(encodings)也会显示很多的编码名称。
python2.x 版本与 python3 字符编码的差别:
Python 2.X有一种通用的字符串类型来表示二进制数据和像ASCII这样的8位文本,还有一种特定的类型用来表示多字节Unicode文本:
-
str表示8位文本和二进制数据。
-
unicode用来表示宽字符Unicode文本。
python 3.X带有3种字符串对象类型——一种用于文本数据,两种用于二进制数据:
- str表示Unicode文本(8位的和更宽的)。
- bytes表示二进制数据。
- bytearray,是一种可变的bytes类型
创建byte对象:
在Python 3.0中,所有当前字符串常量形式,'xxx'、"xxx"和三引号字符串块,都产生一个str;在它们任何一种前面添加一个b或B,则会创建一个bytes。
>>> a=b'hehe' >>> a b'hehe' >>> a.__class__ <class 'bytes'>
>>> a[0],a[1:],ord('h')
104,b'ehe',104
python3.0手动转换:
- str.encode()和bytes(S, encoding)把一个字符串转换为其raw bytes形式,并且在此过程中根据一个str创建一个bytes。
- bytes.decode()和str(B, encoding)把raw bytes转换为其字符串形式,并且在此过程中根据一个bytes创建一个str。
>>> s = 'ok' >>> s.encode();bytes(s,encoding='ascii') b'ok' b'ok'
python2.6中编码方式有点差别:
在2.6中为了存储任意的编码的Unicode文本,用u'xxx'常量形式创建一个unicode对象(这个常量在Python 3.0中不再可用,因为Python 3.0中所有字符串都支持Unicode)
>>> u = b'test' >>> u 'test' >>> u = u'test' >>> u u'test'
Python 2.6和Python 3.0之间的一个主要区别在于,unicode和非Unicode的str对象可以在表达式中自由地混合,并且,只要str和unicode的编码兼容,Python将自动将其向上转换为unicode(在Python 3.0中,str和bytes不会自动混合,并且需要手动转换)
#python2.7 >>> u'abc' + 'def' u'abcdef' >>> b'abc' + 'def' 'abcdef' #python3.31 >>> u'abc' + 'def' 'abcdef' >>> b'abc' + 'def' ... TypeError: can't concat bytes to str
字符串声明:
对于在脚本文件中编码的字符串,Python默认地使用UTF-8编码,但是,它允许我们通过包含一个注释来指明想要的编码,从而将默认值修改为支持任意的字符集。这个注释必须拥有如下的形式,并且在Python 2.6或Python 3.0中必须作为脚本的第一行或第二行出现。
# -*- coding: utf-8 -*-
浙公网安备 33010602011771号