字符編碼表就是一張字符與數(shù)字的對(duì)應(yīng)關(guān)系的表內(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,但是它們兩之間不能通過(guò) 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 python 文件的執(zhí)行過(guò)程: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 解釋器讀入文本文件不亂碼,可以在文本文件開(kāi)頭指定編碼格式,這樣 python2 解釋器將內(nèi)容讀入內(nèi)存時(shí)就會(huì)知道 文本內(nèi)容使用的編碼格式。 保證了運(yùn)行 python 程序前兩個(gè)階段不亂碼的核心是指定編碼格式,即用什么編碼存入硬盤的: 在 文件首行寫入包含 # 號(hào)在內(nèi)的以下內(nèi)容:
解釋器會(huì)先用默認(rèn)的編碼方式讀取文件的首行內(nèi)容,由于首行是純英文組成,而任何編碼方式都可以識(shí)別英文字符。 例: 在 python2 中
python2:str 有兩種類型:str 和 unicode str類型:
unicode 類型:
保證python2 的 str 類型不亂碼:
python3:str 類型默認(rèn)直接存為 unicode 格式,無(wú)論如何都不會(huì)亂碼 結(jié)論:1、內(nèi)存中固定使用的是 unicode、這是不能改變的,我們可以改變的是存入硬盤的格式
2、文本文件存取亂碼問(wèn)題 1)存亂了: 例:如果用戶輸入的內(nèi)容中包含中文和日文字符,如果單純以shift_JIS存,日文可以正常寫入硬盤,而由于中文字符在shift_jis中沒(méi)有找到對(duì)應(yīng)關(guān)系而導(dǎo)致存亂了 解決方法是:將文本文件編碼格式設(shè)置成支持文件內(nèi)字符串的格式 2)讀亂了: 例:如果硬盤中的數(shù)據(jù)是shift_JIS格式存儲(chǔ)的,采GBK格式讀入內(nèi)存就讀亂了 解決方法是:文件以什么編碼格式存如硬盤,就應(yīng)該以什么編碼格式讀入內(nèi)存。 總結(jié):1、保證存的時(shí)候不亂:在由內(nèi)存寫入硬盤時(shí),必須將編碼格式設(shè)置為支持所輸入字符的編碼格式 2、保證讀的時(shí)候不亂:在由硬盤讀入內(nèi)存是,必須采用與寫入硬盤時(shí)相同的編碼格式 二 編碼與解碼編碼: 由字符轉(zhuǎn)換成內(nèi)存中 unicode,以及由 unicode轉(zhuǎn)換成其他編碼(存在硬盤里)的過(guò)程,都稱為編碼encode 字符-------------encode-------------》unicode---------encode---------》GBK、utf-8、Shift_JIS 解碼: 由內(nèi)存中的 unicode 轉(zhuǎn)換成字符,以及由其他編碼(存在硬盤里)轉(zhuǎn)換成 unicode 的過(guò)程,都被稱為解碼 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./content-4-657401.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》