字符编码-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

posted @ 2017-12-27 11:46  Wesley·zk  阅读(151)  评论(0)    收藏  举报