字符编码-Day3
一、字符编码
1、常用的字符编码
GBK:汉字2bytes,英文1bytes
UTF-8:汉字3bytes,英文1bytes
Unicode:汉字2bytes,英文2bytes
2、在不同设备中的编码
内存:Unicode
硬盘:GBK,UTF-8等
3、编码encode和解码decode
编码:内存写入硬盘需要将Unicode转换成其他字符编码
Unicode--->encode--->utf-8
解码:硬盘读取数据到内存需要转换成Unicode
Unicode<---decode<---utf-8
4、乱码问题的根源
编码的时候用了一种格式,而解码的时候用了另外一种格式
5、定义编码格式
在文件头部定义字符编码
#!/usr/bin/env python #--*-- coding:utf-8 --*-- # @Time : 2018/4/21 18:44 # @Author : Wesley
6、python不同版本默认编码:
python2:ASCII
python3:UTF-8
字符串类型:
python2:字符串类型的编码格式使用文件头指定的编码
#示例,不是代码
#conding:gbk
'你好'.decode('gbk') #将gbk ---> Unicode
'你好'.encode('utf-8') #将Unicode ---> gbk
python3:字符串类型的编码格式统一使用Unicode
#示例,不是代码
Unicode=‘你好’,encode(‘utf-8’) #Unicode ---> UTF-8
Unicode.decode('utf-8') #UTF-8 ---> Unicode
二、示例代码
1、python2

(python2的编码和转码的过程,图1)
示例代码1:#--*-- coding:utf-8 --*--的情况下
s ='耶稣爱你'
print(s)
#将UTF-8解码成Unicode编码
s_to_unicode = s.decode("utf-8")
print("---------s_to_unicode------------")
print(s_to_unicode)
#将Unicode解码成GBK编码
unicode_to_gbk=s_to_unicode.encode("gbk")
print("---------unicode_to_gbk------------")
print(unicode_to_gbk)
#将GBK解码成Unicode再编码成UTF-8
gbk_to_utf8=unicode_to_gbk.decode("gbk").encode("utf-8")
print("---------gbk-to-utf8------------")
print(gbk_to_utf8)
#返回值:
耶稣爱你
---------s_to_unicode------------
耶稣爱你
---------unicode_to_gbk------------ #因为默认编码是UTF-8,无法显示gbk
Ү�հ���
---------gbk-to-utf8------------
耶稣爱你
示例代码2:Unicode的情况下
s =u'耶稣爱你' #u代码字符编码是Unicode
s_to_gbk = s.encode("gbk") #将Unicode编码直接解码成gbk
print("---------s_to_gbk------------")
print(s_to_gbk)
gbk_to_utf8=s_to_gbk.decode("gbk").encode("utf-8") #将GBK解码成Unicode再编码成UTF-8
print("---------gbk-to-utf8------------")
print(gbk_to_utf8)
#返回值:
---------s_to_gbk------------
Ү�հ���
---------gbk-to-utf8------------
耶稣爱你
python2小结:在python2中,脚本的开头部分要指定字符编码格式为UTF-8,如果不指定,无法打印中文字符。因为默认使用系统编码ASCII格式,ASCII不存在中文编码。
2、python3
在须知中已经说到python3的字符串编码,默认是Unicode,所以字符串编码之间的转换不需要decode解码过程,直接encode即可
示例代码1:
s = "耶稣爱你" #字符串s已经是Unicode编码,无需decode,直接encode
s_to_gbk = s.encode("gbk")
print("--------s_to_gbk--------")
print(s_to_gbk)
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8") #gbk转换成utf-8,需要先解码成Unicode,再编码成utf-8
print("--------gbk_to_utf8--------")
print(gbk_to_utf8)
unicode = gbk_to_utf8.decode("utf-8") #utf-8转成Unicode,直接解码就行
print("--------utf-8_to_unicode--------")
print(unicode)
#返回值:
--------s_to_gbk--------
b'\xd2\xae\xf6\xd5\xb0\xae\xc4\xe3' #因为是bytes类型,所以无法显示
--------gbk_to_utf8--------
b'\xe8\x80\xb6\xe7\xa8\xa3\xe7\x88\xb1\xe4\xbd\xa0'
--------utf-8_to_unicode--------
python3小结:在python3,encode编码的同时会把string变成bytes类型,decode解码的同时会把bytes类型变成string类型,所以你就不难看出encode后的把它变成一个bytes类型的数据。还有需要特别注意的是:不管是否在python3的文件开头申明字符编码,只能表示,这个python文件时这个字符编码,文件中的字符串还是Unicode

浙公网安备 33010602011771号