字符编码

字符编码历史:

ASCII:英文和特殊字符占1个字节,没有中文。 

GB2312:收录了6763个常用汉字和682个其它符号; 

GBK: 为了满足中文,中国人定制了GBK,GBK是从GB2312扩展而来的,支持繁体,并且兼容GB2312; 

Unicode:把所有语言都统一到一套编码里,这样就不会再有乱码问题了;所有的编码转换都要经过Unicode,兼容GBK所有的编码,中文字符、 英文字符都占用2个字节。 

GB18030: GB2312和GBK都是用两个字节来编码的,它采用类似UTF-8的编码方式进行编码(每个字符的编码可以是1、2或4个字节),拥有上百万个编码空间,足以支持中日韩三国所有汉字,并且还可以支持国内少数民族的文字。 

UTF-8:西方国家觉得Unicode空间占用大,Unicode英文字符占用2个字节;之前ASCII才占用一个字节,所以发明UTF-8;UTF-8英文占用1个字节;中文占用3个字节;英文按照ASCII的形式存储;

注意: 

Unicode 格式在utf-8编码里面可以直接正常使用的,utf-8是Unicode的扩展集


python2中:
存的是编码的字符串

str类型

当python解释器执行到产生字符串的代码时(例如s='林'),会申请新的内存地址,然后将'林'encode成文件开头指定的编码格式,这已经是encode之后的结果了,所以s只能decode 文件开头定义的类型,然后再进行操作

str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes;

python2中默认编码是ASCII,不支持中文,所以 print('中国') 会报错;

python3中:

存的是unicode编码,所以只能encode任意编码,然后再进行操作

s='林' #当程序执行时,无需加u,'林'也会被以unicode形式保存新的内存空间中;

当我们保存的的时候,.py文件就以pycharm默认的编码方式保存到了磁盘;关闭文件后再打开,pycharm就再以默认的编码方式对该文件打开后读到的内容进行解码,转成unicode到内存我们就看到了我们的明文;

而如果我们点击运行按钮或者在命令行运行该文件时,py解释器这个软件就会被调用,打开文件,然后解码存在磁盘上的bytes数据成unicode数据,这个过程和编辑器是一样的,不同的是解释器会再将这些unicode数据翻译成C代码再转成二进制的数据流,最后通过控制操作系统调用cpu来执行这些二进制数据,整个过程才算结束。

python3默认编码的utf-8,可以通过如下方式查询:

import sys

print(sys.getdefaultencoding())
 
在python 2.7.5代码如下:

#coding:utf-8

#s = u"你好"
s = "你好"
s_to_unicode = s.decode("utf-8")
print (s_to_unicode)
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk)
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)

Xshell 是Utf-8 输出如下:

  

Xshell 是gbk 输出如下

 

decode("utf-8")是解码前是:utf-8

encode("gbk")是编码后是:gbk

不管在Python2还是Python3中:解码都是解码成Unicode

Python3.7.0中如下:

#coding:GBK
s = "你好"
s_gbk = s.encode("gbk")
print('gbk',s_gbk)
print('utf-8',s.encode("utf-8"))
print(s.encode())
gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")
print('utf8',gbk_to_utf8)
输出如下:

gbk b'xc4xe3xbaxc3'
utf-8 b'xe4xbdxa0xe5xa5xbd'
b'xe4xbdxa0xe5xa5xbd'
utf8 b'xe4xbdxa0xe5xa5xbd'

Python3中encode()默认编码成utf-8 ,在Python3中encode(编码)不仅转换了编码还变成了bytes(字节);

 utf-8,gbk,unicode等这些都是文件内容中字符串的编码,bytes是计算机存储的编码,数据不管存在内存还是硬盘中都是以bytes类型存储;

--------------------------------------------------------------------

f = open('a.txt','r+',encoding='GBK')

其中encoding='GBK'是指打开的文件的编码是GBK
--------------------------------------------------------------------
python3 中
s.decode() 括号里面不写编码,默认是utf-8编码;

参考:

https://www.cnblogs.com/alex3714/articles/7550940.html    (主要看这个)

https://www.cnblogs.com/zihe/p/6993891.html

https://www.cnblogs.com/575dsj/p/7112767.html

http://www.cnblogs.com/yuanchenqi/articles/5956943.html

原文地址:https://www.cnblogs.com/lighthouse/p/9375917.html