前言
现在Python环境可以分为2和3。Python 2.x的开发环境默认编码是ascii,Python 3.x是Unicode。下面就这个编码问题简单讨论一下。
Python 3.x的编码
Python 3.x默认编码是Unicode,也就是说,Python 3.x的字符串是Unicode编码方式,控制台也是。
测试代码
# Python Version:3.5.1
import sys
b_str = b"abcd 1234"
u_str = "abcd 1234 中文"
u_str_a = "abcd 1234".encode('ascii')
u_str_e = "abcd 1234 中文".encode('utf-8')
u_str_gbk = "abcd 1234 中文".encode('gbk')
if __name__ == '__main__':
print(sys.getdefaultencoding())
print(b_str)
print(u_str)
print(u_str_a)
print(u_str_e)
print(u_str_gbk)
打印如下
utf-8
b’abcd 1234’
abcd 1234 中文
b’abcd 1234’
b’abcd 1234 \xe4\xb8\xad\xe6\x96\x87’
b’abcd 1234 \xd6\xd0\xce\xc4’
- 第一行是打印系统默认的编码,这里是utf-8
b_str
的字符串前面加了一个b
,表示以Ascii方式存储,控制台输出的字符串前面也有一个b
,表示这是以Ascii输出;u_str
则是默认的字符串,是Unicode编码,控制台输出正常的字符串;u_str_a
是从Unicode转码Ascii;u_str_e
是从Unicode转码utf-8,实际上,utf-8是Unicode的一种实现方式;u_str_gbk
是从Unicode转码GBK,对照u_str_e
的输出可见,其中文输出的编码与之不同。
Python 2.x的编码
Python 2.x的默认编码是ascii,控制台暂时不知道是Unicode编码还是utf-8编码。
测试代码
# coding=utf-8
import sys
b_str = b"abcd 1234"
u_str = u"abcd 1234 中文"
u_str_a = u"abcd 1234".encode('ascii')
a_str_u = "abcd 1234".encode('utf-8')
u_str_gbk = u"abcd 1234 中文".encode('gbk')
if __name__ == '__main__':
print(sys.getdefaultencoding())
print(b_str)
print(u_str)
print(u_str_a)
print(a_str_u)
print(u_str_gbk.decode('gbk'))
打印内容如下:
ascii
abcd 1234
abcd 1234 中文
abcd 1234
abcd 1234
abcd 1234 中文
其测试代码类似于Python 3.x的测试代码。
- 第一行打印系统默认的编码方式:ascii
- b_str
是测试ascii字符串,其在控制台正常输出,没有Python 3.x控制台下的b
;
- u_str
是以Unicode方式编码的字符串,正常输出;
- u_str_a
是Unicode转码成Ascii,然后输出;
- a_str_u
是Ascii转码Unicode,然后输出
- u_str_gbk
是Unicode转码成GBK,打印的时候需要GBK解码,才能在控制台正常输出。
小技巧
- 在Python开发中,给字符串前面添加一个
b
,表示该字符串以Ascii方式编码,添加一个u
,表示以Unicode方式编码,这种方式与文件的编码无关。