Python 中的字符串编码

定义字符串

Python 中存在两种编码方式的字符串:ASCII 和 Unicode。Python 2.7 默认的编码方式是 ASCII,即当直接使用''""或者''' '''来定义字符串时,采用的是 ASCII 的编码方式。

str = 'This is an ASCII string'

Unicode 字符串的定义方式需要在前面添加u.

ustr = u'This is an Unicode string'

到 Python 3.x 时,字符串默认的编码方式为 Unicode,即'string'u'string'等价。若要定义 ASCII 编码的字符串需在字符串前加b,如

str = b'This is an ASCII string in Python 3.x'

字符串编码

ASCII 编码采用一个字节对字符编码,一个字节有8个bit,可以编码 256(2^8) 个字符。这对英文字符够用,但对很多其他国家的字符集是远远不足的。所以,为了对世界上的所有字符统一进行编码,Unicode 的编码方式诞生。

Unicode 的编码方式采用更多的字节对字符编码,通常采用2个字节表示一个字符。Unicode 编码表示英文字符时,左边的字节用零填充。但是如果文本的内容全部是英文,采用2字节的 Unicode 编码方式,势必会浪费一半空间,对存储和网络传输带来负担。于是,可变长的编码方式utf-8产生。

utf-8对英文的编码方式跟 ASCII 相同,都采用一个字节。对其他的字符采用1~6个不等的字节进行编码。

现在计算机通用的字符编码的工作方式是:内存中使用 Unicode 编码,存盘或网络传输使用utf-8编码。

编码转换

Python 中将 Unicode 字符以utf8的方式编码:

>>> u'中文'.encode('utf8')
'\xe4\xb8\xad\xe6\x96\x87'

utf8编码的字符串解码成 Unicode 字符串:

>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf8')
u'\u4e2d\u6587'

ASCII 编码的字符串也是以utf8的方式编码的字符串。所以,可以将 ASCII 字符串解码成 Unicode 字符串,而将 ASCII 字符串编码成 Unicode 字符串时,字符串不变:

>>> 'ABC'.encode('utf8')
'ABC'
>>> 'ABC'.decode('utf8')
u'ABC'

文件编码

当文件中有中文等 Unicode 字符时,需要指定py文件的utf-8的编码方式,只需在源文件的开头如下声明:

# -*- coding: utf-8 -*-
22 August 2014

blog comments powered by Disqus