Python下unicode和string编码

问题

#!/usr/bin/python
# -*- coding: utf-8 -*-

s = "你好"
s.encode("utf-8")

运行结果报错

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

报错原因

在python里面,编码和解码的关系如下:

unicode -> string 编码
string -> unicode 解码

上面的s变量其实是string类型,如果尝试对s进行encode,那么必须对s变量进行解码成unicode,然后再编码成string。但是在s变量解码的过程中,python会根据系统默认的解码方式进行解码,根据报错可以看出是python默认的解码方式是"ascii",sys.getdefaultencoding()可以查看。但是因为文件开头指定了s变量又是utf-8的编码方式,所以就冲突了,做法就是在编码之前指定"utf-8"进行解码。

如何判断某个字符串的编码?

isinstance(s, str) 用来判断是否为一般字符串

isinstance(s, unicode) 用来判断是否为unicode
#!/usr/bin/python
# -*- coding: utf-8 -*-

string = "你好"
string.decode('utf-8').encode("utf-8")

还有一种方式就是修改python默认编码解码方式

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

标签:Python