字符编码
一 字符编码
字符编码表就是一张字符与数字的对应关系的表
内存
上 ------------------->翻译 ------------------>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:\Users\Administrator>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---------------》字符
在 python3 中:
x = '上' # str 类型 ---->被存成 unicode
res = x.encode('gbk') #-----> gbk编码:b’\xc9\xcf‘ 为bytes类型
s = res.decode('gbk')#------>unicode编码, python解释器默认帮你将 unicode 编码转换为了字符给人类看:'上'
x.encode('utf-8')#---->utf-8编码:b’\xe4\xb8\x8a‘ 为bytes类型
补充:
浏览网页的时候,服务器会把动态生成的 unicode 内容转为 UTF-8 再传输到浏览器
如果服务端 encode 的编码格式是utf-8,客户端内存中收到的也是 utf-8 编码的结果