python2编码的问题
Posted 我是一个快乐的小op
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python2编码的问题相关的知识,希望对你有一定的参考价值。
1,python2的默认编码是ascii码。
2,python2中有2中数据模型来支持字符串这种数据类型,分别为str和unicode。
3,uncode转换为其他编码是encode,其他编码转换成unicode是decode(解码)。所以unicode是核心,比如你现在有个gbk的字符串,如果想要变成utf-8,那你需要先decode然后在encode才行。
4,文件开头声明的编码与定义str是有关系的。str有utf-8 gbk gb2312 ascaii等。
比如:
#!/usr/bin/env python # *-*coding:utf-8 *-* s = \'中国\' print(type(s)) 结果:<type \'str\'>
可以发现s是一个字符串,但其实它的编码也是utf-8,因为开头的声明变量就是utf-8。
#!/usr/bin/env python # *-*coding:utf-8 *-* s = \'中国\' print(type(s)) data = s.decode(\'utf-8\') print(data) print(type(data)) 结果: <type \'str\'> 中国 <type \'unicode\'>
可以发现s.decode(‘utf-8’)就将s解码为unicode,这个时候data就可以编码为其他的格式了。
比如:
#!/usr/bin/env python # *-*coding:utf-8 *-* s = \'中国\' print(type(s)) s_unicode = s.decode(\'utf-8\') s_gbk = s_unicode.encode(\'gbk\')
上述结果会输出一个gbk编码的字符串,但是可能会显示乱码。这个取决于你的终端。如果你使用的是windows 的cmd窗口,默认是gbk的话,就会显示出来了,但是如果你使用的是linux的终端或者pycharm运行会乱码。
5,上面说到一点,python2默认使用的是ascii码作为默认编码,所以会有一个问题。如下:
这就纳闷了,我刚刚明明是编码,为啥会显示解码呢?就算是解码为啥会是ascii码呢?这个就和Python2么默认编码有关系了。
因为python2默认在我编码的时候用默认的ascii码给我解码,所以
s.encode(\'utf-8\') 过程是 s.decode(\'ascii\').encode(\'utf-8\' ) ,而s没办法解码为unicode。因为它其实本质上是utf-8,所以这也就无法解码了,报错了。
这就是默认编码的尴尬之处。
6,文件操作
python2操作文件,会经常报错。。。。。。。。。这就是因为咱们没搞清楚。所以,下面就谈谈自己的粗浅想法。
操作文件,建议使用codecs这个模块,非常方便。codecs提供open方法,open()方法可以指定编码格式。
使用这个方法打开这个文件读取返回都是unicode。写入时,如果write参数是unicode。则使用打开文件时的编码写入,如果是str,则先使用默认编码解码成unicode后再以打开文件的编码写入
这里需要注意的是如果str是中文,而默认编码sys.getdefaultencoding()是ascii的话会报解码错误。
从上面可以发现默认打开文件,它会自动编码,如果没有指定编码,这个时候他用又得用默认编码,所以过程是s.encode(\'ascii\') 所以这就不报错了吗?
所以写入的时候就指定编码就可以了。于是乎:
这样就可以避免报错了。
下面是读取,可以发现读取,是unicode编码。文件流.decode(\'utf-8\')
上面作为自己的笔记,可能有错误哦。
以上是关于python2编码的问题的主要内容,如果未能解决你的问题,请参考以下文章
对 python2 和 python3 使用相同的代码进行编码 + 加密 + 填充的问题