说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情。所以有必要要讲讲清楚
1、须知:
2、py2中的编码和转码的过程,如图:

注:因为unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,在编码成需要转的字符编码
3、py2字符编码的转换,代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#! /usr/bin/env python# -*- coding:utf-8 -*-# __auther__ == zhangqigaos = "其高最帅"#utf-8解码成unicode编码s_to_unicode = s.decode("utf-8")print("--------s_to_unicode-----")print(s_to_unicode)#然后unicode再编码成gbks_to_gbk = s_to_unicode.encode("gbk")print("-----s_to_gbk------")print(s_to_gbk)#gbk解码成unicode再编码成utf-8gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")print("------gbk_to_utf8-----")print(gbk_to_utf8)#输出--------s_to_unicode-----其高最帅-----s_to_gbk------??????------gbk_to_utf8-----其高最帅 |
注:以上这种情况适合字符是非unicode编码请款下,但是如果字符编码已经是Unicode的了咋办呢?广告回来,更加精彩。。。。。
4、字符编码已经是unicode情况下,代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#! /usr/bin/env python# -*- coding:utf-8 -*-# __auther__ == zhangqigao#u代码字符编码是unicodes = u‘你好‘#已经是unicode,所以这边直接是编码成gbks_to_gbk = s.encode("gbk")print("----s_to_gbk----")print(s_to_gbk)#这边再解码成unicode然后再编码成utf-8gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")print("-----gbk_to_utf8---")print(gbk_to_utf8)#输出----s_to_gbk----???-----gbk_to_utf8---你好 |
注:在python2中,在文件的开头指定字符编码,是要告诉解释器我现在的字符编码使用的是utf-8,那我在打印的中文时候,那么在utf-8中包含中文字符,那么可以打印出来。那么如果你不制定字符编码,默认使用系统编码,如果你的系统编码是ASCII,那么就会报错,因为ASCII不能存中文字符。
5、py3的字符编码转换
在须知中已经说到python 3的编码,默认是unicode,所以字符编码之间的转换不需要decode过程,直接encode即可,代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#! /usr/bin/env python# __auther__ == zhangqigao#无需声明字符编码,当然你声明也不会报错s = ‘你好‘# 字符串s已经是unicode编码,无需decode,直接encodes_to_gbk = s.encode("gbk")print("----s_to_gbk----")print(s_to_gbk)#这边还是一样,gbk需要先解码成unicode,再编码成utf-8gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")print("-----gbk_to_utf8---")print(gbk_to_utf8)#解码成unicode字符编码utf8_decode = gbk_to_utf8.decode("utf-8")print("-------utf8_decode----")print(utf8_decode)#输出----s_to_gbk----b‘\xc4\xe3\xba\xc3‘-----gbk_to_utf8---b‘\xe4\xbd\xa0\xe5\xa5\xbd‘-------utf8_decode----你好 |
注:在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型,所以你就不难看出encode后的把它变成了一个bytes类型的数据。还有需要特别注意的是:不管是否在python 3的文件开头申明字符编码,只能表示,这个python文件是这个字符编码,文件中的字符串还是unicode,如下图:

总结:
原文:http://www.cnblogs.com/luoahong/p/7159852.html