angrykola

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

字符编码介绍:

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 -*-

 

posted on 2013-11-27 00:43  kolaman  阅读(537)  评论(0)    收藏  举报