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