Python2字符串编解码问题
在python2中有两种类型的字符串:str和unicode。二者的转换如下:
unicode字符串通过encode函数转换为str字符串,称为编码;
str字符串通过decode函数转化为unicode字符串,称为解码.
下面以print打印为例进行说明:
当字符串为str类型时,操作系统直接将其交给终端进行显示;
当字符串为unicode类型时,操作系统会先将其编码为str类型,然后交给终端显示。
1. Non-ASCII character错误
例子:
import sys
print(sys.getdefaultencoding())
print(sys.stdout.encoding) # 打印stdout的编码方式
a = "测试"
b = u"测试"
print(a)
print(b)
错误:
SyntaxError: Non-ASCII character '\xe6' in file t.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
原因及改进:
该python文件存在中文字符,但是文件本身并未指定编码方式,此时python会按照系统的默认编码(ascii)执行该python文件,因此报错了。可以在文件的开头添加# coding:utf-8
即可解决该问题。
2. UnicodeEncodeError错误
例子:
# coding: utf-8
import sys
print(sys.getdefaultencoding())
print(sys.stdout.encoding) # 打印stdout的编码方式
a = "测试"
b = u"测试"
print(a)
print(b)
错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position
原因及改进:
由于变量b为unicode类型,因此print(b)时操作系统需要先按照stdout的默认编码将其编码为str类型,最后交给终端显示;但是stdout的编码为ascii(通过调用sys.stdout.encoding), 因此报错。可以通过指明编码方式即print(b.encode('utf-8'))
解决。
3. UnicodeDecodeError错误
例子:
# coding: utf-8
import sys
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
a = "测试"
b = u"测试"
print(a.decode())
print(b.encode('utf-8'))
错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position
原因及改进:
执行print(a.decode())
时由于没有指明解码方式,因此使用了sys.getdefaultencoding()
的默认编码(ascii),因此报错;可以通过指定解码方式即print(a.decode('utf-8'))
解决。