內(nèi)存
上 ------------------->翻譯 ------------------>01011010
上 <-------------------- 翻譯<-----------------01011010
ASCII表:
1、只支持英文字符串
2、采用 8 位二進(jìn)制數(shù)對(duì)應(yīng)一個(gè)英文字符串
GBK 表:
1、支持英文字符、中文字符
2、采用 8 位(8bit=1Bytes)二進(jìn)制數(shù)對(duì)應(yīng)一個(gè)英文字符串
采用 16 位(16bit = 2Bytes)二進(jìn)制數(shù)對(duì)應(yīng)一個(gè)中文字符串
unicode(內(nèi)存中統(tǒng)一使用 unicode):
1、兼容萬(wàn)國(guó)字符,與萬(wàn)國(guó)字符都有對(duì)應(yīng)關(guān)系
2、采用 16 位(16bit=2Bytes)二進(jìn)制對(duì)應(yīng)一個(gè)字符串
個(gè)別生僻會(huì)采用 4Bytes 、8Bytes
人類輸入的字符------------->unicode格式數(shù)字(內(nèi)存中)<------------->GBK格式二進(jìn)制(硬盤)
人類輸入的字符------------->unicode格式數(shù)字(內(nèi)存中)<------------->Shift_JIS格式二進(jìn)制(硬盤)
注:GBK 與 Shift_JIS字符編碼都可以轉(zhuǎn)為 unicode,但是它們兩之間不能通過 unicode互轉(zhuǎn)
UTF-8:
1、英文采用1 個(gè) Bytes
2、中文采用 3 個(gè) Bytes
window :默認(rèn)采用 GBK
mac :默認(rèn)采用 utf-8
linux:默認(rèn)采用 utf-8
1、先將 python 解釋器啟動(dòng)
2、調(diào)用系統(tǒng)操作,將文本文件內(nèi)容由硬盤讀入內(nèi)存
3、解釋器解釋并執(zhí)行剛剛讀入內(nèi)存的文本內(nèi)容,識(shí)別相關(guān)語(yǔ)法。
python 解釋器:
python 2:默認(rèn)的是 ascii 碼
python 3:默認(rèn)的是 utf-8 碼
為了能夠在 python2 解釋器讀入文本文件不亂碼,可以在文本文件開頭指定編碼格式,這樣 python2 解釋器將內(nèi)容讀入內(nèi)存時(shí)就會(huì)知道 文本內(nèi)容使用的編碼格式。
保證了運(yùn)行 python 程序前兩個(gè)階段不亂碼的核心是指定編碼格式,即用什么編碼存入硬盤的:
在 文件首行寫入包含 # 號(hào)在內(nèi)的以下內(nèi)容:
#coding:當(dāng)初寫入硬盤時(shí)采用的編碼格式 #告訴 python 解釋器,文本內(nèi)容的編碼格式
解釋器會(huì)先用默認(rèn)的編碼方式讀取文件的首行內(nèi)容,由于首行是純英文組成,而任何編碼方式都可以識(shí)別英文字符。
例:
在 python2 中
# coding:utf-8x = '上' # x的值為untf-8格式的二進(jìn)制 python解釋器執(zhí)行到這一步時(shí),會(huì)新建一塊內(nèi)存空間來(lái)存入 "上" 值。print(x) # 打印操作是將x的值,即utf-8格式的二進(jìn)制交給終端,當(dāng)終端收到后發(fā)現(xiàn)并不是unicode(只有unicode才與字符有對(duì)應(yīng)關(guān)系),所以終端會(huì)執(zhí)行操作:utf-8二進(jìn)制---解碼(decode)-->unicode格式的二進(jìn)制,解碼的過程中使用的程序終端會(huì)采用自己默認(rèn)的編碼格式,而在pycharm的終端默認(rèn)編碼為utf-8、windows下的cmd終端的默認(rèn)編碼為gbk,所以該打印操作在pycharm中顯示正常,而在windows下的cmd中則亂碼# 在windows下的cmd中運(yùn)行效果如下C:\Users\Administrator>python2 E:\aaa.py涓
python2:str 有兩種類型:str 和 unicode
str類型:
x = ‘上’ #字符串會(huì)按照文件頭指定的編碼格式存入變量值的內(nèi)存空間
unicode 類型:
#coding:utf-8 x = u‘上’ #強(qiáng)調(diào)存成 unicode 等同于 x= '上'.decode(utf-8)
保證python2 的 str 類型不亂碼:
#coding:utf-8 x = u'上' # #強(qiáng)調(diào)存成 unicode 等同于 x= '上'.decode(utf-8)
python3:str 類型默認(rèn)直接存為 unicode 格式,無(wú)論如何都不會(huì)亂碼
1、內(nèi)存中固定使用的是 unicode、這是不能改變的,我們可以改變的是存入硬盤的格式
英文 漢字-》unicode-》gbk 英文 日文-》unicode-》shift-jis 萬(wàn)國(guó)字符》-unicode-》utf-8
2、文本文件存取亂碼問題
1)存亂了:
例:如果用戶輸入的內(nèi)容中包含中文和日文字符,如果單純以shift_JIS存,日文可以正常寫入硬盤,而由于中文字符在shift_jis中沒有找到對(duì)應(yīng)關(guān)系而導(dǎo)致存亂了
解決方法是:將文本文件編碼格式設(shè)置成支持文件內(nèi)字符串的格式
2)讀亂了:
例:如果硬盤中的數(shù)據(jù)是shift_JIS格式存儲(chǔ)的,采GBK格式讀入內(nèi)存就讀亂了
解決方法是:文件以什么編碼格式存如硬盤,就應(yīng)該以什么編碼格式讀入內(nèi)存。
1、保證存的時(shí)候不亂:在由內(nèi)存寫入硬盤時(shí),必須將編碼格式設(shè)置為支持所輸入字符的編碼格式
2、保證讀的時(shí)候不亂:在由硬盤讀入內(nèi)存是,必須采用與寫入硬盤時(shí)相同的編碼格式
編碼:
由字符轉(zhuǎn)換成內(nèi)存中 unicode,以及由 unicode轉(zhuǎn)換成其他編碼(存在硬盤里)的過程,都稱為編碼encode
字符-------------encode-------------》unicode---------encode---------》GBK、utf-8、Shift_JIS
解碼:
由內(nèi)存中的 unicode 轉(zhuǎn)換成字符,以及由其他編碼(存在硬盤里)轉(zhuǎn)換成 unicode 的過程,都被稱為解碼 decode
(utf-8、Shift_JIS、GBK--------decode----------》unicode-----------decode---------------》字符
補(bǔ)充:
瀏覽網(wǎng)頁(yè)的時(shí)候,服務(wù)器會(huì)把動(dòng)態(tài)生成的 unicode 內(nèi)容轉(zhuǎn)為 UTF-8 再傳輸?shù)綖g覽器
如果服務(wù)端 encode 的編碼格式是utf-8,客戶端內(nèi)存中收到的也是 utf-8 編碼的結(jié)果
來(lái)源:https://www.icode9.com/content-4-657401.html聯(lián)系客服