字符编码

一 字符编码

字符编码表就是一张字符与数字的对应关系的表

​ 内存

上 ------------------->翻译 ------------------>01011010

上 <-------------------- 翻译<-----------------01011010

ASCII表:

​ 1、只支持英文字符串

​ 2、采用 8 位二进制数对应一个英文字符串

GBK 表:

​ 1、支持英文字符、中文字符

​ 2、采用 8 位(8bit=1Bytes)二进制数对应一个英文字符串

​ 采用 16 位(16bit = 2Bytes)二进制数对应一个中文字符串

unicode(内存中统一使用 unicode):

​ 1、兼容万国字符,与万国字符都有对应关系

​ 2、采用 16 位(16bit=2Bytes)二进制对应一个字符串

​ 个别生僻会采用 4Bytes 、8Bytes

人类输入的字符------------->unicode格式数字(内存中)<------------->GBK格式二进制(硬盘)

人类输入的字符------------->unicode格式数字(内存中)<------------->Shift_JIS格式二进制(硬盘)

注:GBK 与 Shift_JIS字符编码都可以转为 unicode,但是它们两之间不能通过 unicode互转

UTF-8:

​ 1、英文采用1 个 Bytes

​ 2、中文采用 3 个 Bytes

window :默认采用 GBK

mac :默认采用 utf-8

linux:默认采用 utf-8

python 文件的执行过程:

​ 1、先将 python 解释器启动

​ 2、调用系统操作,将文本文件内容由硬盘读入内存

​ 3、解释器解释并执行刚刚读入内存的文本内容,识别相关语法。

python 解释器:

​ python 2:默认的是 ascii 码

​ python 3:默认的是 utf-8 码

​ 为了能够在 python2 解释器读入文本文件不乱码,可以在文本文件开头指定编码格式,这样 python2 解释器将内容读入内存时就会知道 文本内容使用的编码格式。

保证了运行 python 程序前两个阶段不乱码的核心是指定编码格式,即用什么编码存入硬盘的:

​ 在 文件首行写入包含 # 号在内的以下内容:

#coding:当初写入硬盘时采用的编码格式    #告诉 python 解释器,文本内容的编码格式

解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。

例:

在 python2 中

# coding:utf-8
x = '上' # x的值为untf-8编码格式  python解释器执行到这一步时,会新建一块内存空间来存入 "上" 值。
print(x) # 打印操作是将x的值,即utf-8格式交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执行操作:utf-8编码---解码(decode)-->unicode格式的二进制,解码的过程中使用的程序终端会采用自己默认的编码格式,而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk,所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码

# 在windows下的cmd中运行效果如下
C:UsersAdministrator>python2 E:aaa.py
涓

python2:str 有两种类型:str 和 unicode

​ str类型:

	 x = ‘上’    #字符串会按照文件头指定的编码格式存入变量值的内存空间

​ unicode 类型:

	#coding:utf-8
  x = u‘上’   #强调存成 unicode 等同于 x= '上'.decode(utf-8)

保证python2 的 str 类型不乱码:

#coding:utf-8
  x = u'上' # #强调存成 unicode 等同于 x= '上'.decode(utf-8)

python3:str 类型默认直接存为 unicode 格式,无论如何都不会乱码

结论:

​ 1、内存中固定使用的是 unicode、这是不能改变的,我们可以改变的是存入硬盘的格式

		英文+汉字-》unicode-》gbk
  
    英文+日文-》unicode-》shift-jis
    
    万国字符》-unicode-》utf-8

2、文本文件存取乱码问题

1)存乱了:

​ 例:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了

解决方法是:将文本文件编码格式设置成支持文件内字符串的格式

2)读乱了:

​ 例:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了

解决方法是:文件以什么编码格式存如硬盘,就应该以什么编码格式读入内存。

总结:

1、保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式

2、保证读的时候不乱:在由硬盘读入内存是,必须采用与写入硬盘时相同的编码格式

二 编码与解码

编码:

由字符转换成内存中 unicode,以及由 unicode转换成其他编码(存在硬盘里)的过程,都称为编码encode

​ 字符-------------encode-------------》unicode---------encode---------》GBK、utf-8、Shift_JIS

解码:

由内存中的 unicode 转换成字符,以及由其他编码(存在硬盘里)转换成 unicode 的过程,都被称为解码 decode

(utf-8、Shift_JIS、GBK--------decode----------》unicode-----------decode---------------》字符

1036857-20170909230621226-849802883

​ 在 python3 中:

x = '上' # str 类型 ---->被存成 unicode
res = x.encode('gbk') #-----> gbk编码:b’xc9xcf‘  为bytes类型
s = res.decode('gbk')#------>unicode编码, python解释器默认帮你将 unicode 编码转换为了字符给人类看:'上'
x.encode('utf-8')#---->utf-8编码:b’xe4xb8x8a‘  为bytes类型

补充:

​ 浏览网页的时候,服务器会把动态生成的 unicode 内容转为 UTF-8 再传输到浏览器

​ 如果服务端 encode 的编码格式是utf-8,客户端内存中收到的也是 utf-8 编码的结果

原文地址:https://www.cnblogs.com/xy-han/p/12483037.html