一、前言
1、任何一個程式都是先存放與硬碟上的,要想運行起來 必須先由硬碟讀取到記憶體,之后cpu去記憶體中取指然后執行,
2、在運行的程式產生的資料最先都是存放在記憶體中的,
3、 計算機是基于電作業的 那么計算機只能識別電信號;
計算機內部存盤資料用的都是01010101的二進制資料,
4、檔案的后綴名僅僅是給人看的 ,因為對應計算機來說所有的資料都是0101010的二進制,
5、普通的文本編輯器和python解釋器的作業流程
相同:
1.任何的程式要想運行都是先從硬碟讀取到記憶體
2.文本編輯器和python解釋器都會去硬碟中讀取你想要讀取的檔案內容
不同:
3.文本編輯器將檔案內容讀取之后僅僅是展示給用戶看
而我們的python解釋器會識別語法并執行python代碼
6、字符編碼研究的范圍只針對文本檔案 ,音頻、視頻這些不包含在內
7、只有文本檔案里寫的是一堆字符
win系統中以.txt結尾的都是文本檔案;wps中更改檔案名后綴為.txt后檔案就會亂碼
8、記憶體固定使用unicode,可以改的是從記憶體寫入硬碟的格式
9、檔案頭:控制的是檔案讀時候的編碼(python解釋器一橫一橫讀,第一行讀到后就會按照檔案頭的編碼型別)
10、如果不知道檔案以什么方式存的,就會亂碼,除非一遍遍試對了
二、概念
1、字符編碼?
字符-------(標準)--------數字
2、字符編碼表
存放的是字符與數字的對應關系
三、字符編碼的發展史
1、一家獨大
計算機起源于美國
美國人用英文交流 但是計算機只能識別二進制資料
為了能夠讓計算機識別人類能夠讀懂的字符,這里面肯定有一個
人類字符 >>> 計算機二進制資料
中間的字符與數字的對應關系其實就是一張表
ASCII碼表
這張表只記錄了英文和數字的對應關系
用8位(bit)來表示一個英文字符
1bytes = 8bit
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024PB = 1EB
ASCII:只能識別英文字符
特點:采用8bit對應一個英文字符
8bit=》1Byte
2、 群雄割據
中國人也用得起計算機
自己做一個漢字跟數字對應關系 GBK
GBK表
漢字、英文 跟數字的對應
1bytes來表示英文
2bytes來表示漢字
如果出現了生僻字可能還需要用3bytes甚至跟多的bytes
GBK:可以識別中文字串與英文字符
特點:采用16bit對應字符,該字符可以是英文字符、也可以是中文字符
日本人也用得起計算機
自己做一個漢字跟數字對應關系 shift_JIS
shift_JIS表
日文、英文 跟數字的對應
韓國人也用得起計算機
自己做一個漢字跟數字對應關系 Euc_kr
Euc_kr表
韓文、英文 跟數字的對應
我們在輸入中文字符的時候
1.內部基于GBK翻譯成了對應的二進制資料 在記憶體
2.然后將基于GBK編碼的二進制資料刷到硬碟 永久保存
3.將硬碟中基于GBK編碼的二進制資料讀取到記憶體之后按照GBK編碼的對應關系翻譯成對應的中文
3、天下一統
萬國碼 unicode
兼容萬國
并且跟之前所有國家的編碼都有對應關系
1990開始研究的 1994年才開始正式使用
所有的字符都是用2bytes來存盤
英文用2bytes
中文也用2bytes
unicode:存在的意義:可以識別萬國字符,兼容老的字符
特點:2Bytes對應一個字符
4、為了盡可能的提升寫入硬碟的速度,衍生出utf-8(英文全稱Unicode Transformation Format)
utf-8
1Byte對應英文字符
3Byte對應一個中文字符
四、總結
1、群雄割據: 英文字符--------------記憶體:ASCII二進制數--------------->硬碟:ASCII二進制數 中文英文字符--------------記憶體:GBK二進制數--------------->硬碟:GBK二進制數 日文英文字符--------------記憶體:shiftJIS二進制數--------------->硬碟:shiftJIS二進制數 韓文英文字符--------------記憶體:Euc-Kr二進制數--------------->硬碟:Euc-Kr二進制數 2、過渡階段: 中文英文字符------------記憶體:unicode=========gbk============>硬碟:GBK二進制數 日文英文字符------------記憶體:unicode=========shifJIS========>硬碟:shiftJIS二進制數 韓文英文字符------------記憶體:unicode=========Euc-Kr=========>硬碟:Euc-Kr二進制數 萬國字符----------------記憶體:unicode=========utf-8==========>硬碟:utf-8二進制數 記憶體固定使用:unicode 我們可以改變的是從記憶體寫入硬碟采用的編碼格式 3、分久必合: 萬國字符----------------記憶體:unicode=========utf-8==========>硬碟:utf-8二進制數 萬國字符----------------記憶體:utf-8==========================>硬碟:utf-8二進制數
五、遇到的問題與解決辦法
亂碼問題: 1、存的時候亂了:采用的字符編碼表無法識別輸入的字符 存的時候就已經亂了,是無法補救的,取的時候一定也亂了 解決方法:存入硬碟的編碼格式應該用utf-8格式 2、存的時候沒有亂碼:采用的字符編碼表可以識別輸入的字符 但是取的時候亂碼了:采用的字符編碼表與當初存的時候用的不是同一張表,可以補救 解決方法:存的時候用什么編碼,取的時候一定要用同樣的編碼格式 與運行python程式有關的亂碼問題: 1、保證運行python程式的前兩個階段不亂碼 在python檔案的開頭加一行: #coding:檔案存的時候用的編碼格式 2、保證第三個階段不亂碼 使用python3 如果使用的是python2,應該在符串前加前綴u
ps:
1、在python3中字串型別的值在記憶體中都是unicode格式的數字
2、在python2中字串型別的值在記憶體中都是檔案頭指定編碼格式的數字
python2中用的是ASCII碼,如果在字串前加前綴u就把字串強制存成unicode格式,推薦使用
六、編碼&解碼
字符對應成數字叫編碼
給用戶展示的是字符
把數字對應成字符的程序叫解碼
字符-----編碼--------》unicode格式的數字------編碼-----》gbk格式的數字
字符-----解碼--------》unicode格式的數字《------解碼-----gbk格式的數字
#示范: x = "上" # unicode格式的數字==編碼===>其他編碼格式的數字 res1=x.encode("gbk") # print(res1,type(res1)) res2=x.encode("utf-8") # print(res2,type(res2)) # bytes型別可以理解為一種硬碟的原生格式,把它當成二進制看 # str型別 # 其他編碼格式的數字==解碼==>unicode格式數字 x=res1.decode("gbk") # print(x) y=res2.decode("utf-8") print(y,type(y))
七、知識擴充:
首先來說,編碼即是密碼本,編碼記錄的就是二進制與文字之間的對應關系,現存的編碼本有: ASCII碼:包含英文字母,數字,特殊字符與01010101對應關系, a 01000001 一個字符一個位元組表示, GBK:只包含本國文字(以及英文字母,數字,特殊字符)與0101010對應關系, a 01000001 ascii碼中的字符:一個字符一個位元組表示, 中 01001001 01000010 中文:一個字符兩個位元組表示, Unicode:包含全世界所有的文字與二進制0101001的對應關系, a 01000001 01000010 01000011 00000001 b 01000001 01000010 01100011 00000001 中 01001001 01000010 01100011 00000001 UTF-8:包含全世界所有的文字與二進制0101001的對應關系(最少用8位一個位元組表示一個字符), a 01000001 ascii碼中的字符:一個字符一個位元組表示, To 01000001 01000010 (歐洲文字:葡萄牙,西班牙等)一個字符兩個位元組表示, 中 01001001 01000010 01100011 亞洲文字;一個字符三個位元組表示,首先來說,編碼即是密碼本,編碼記錄的就是二進制與文字之間的對應關系,現存的編碼本有: ASCII碼:包含英文字母,數字,特殊字符與01010101對應關系, a 01000001 一個字符一個位元組表示, GBK:只包含本國文字(以及英文字母,數字,特殊字符)與0101010對應關系, a 01000001 ascii碼中的字符:一個字符一個位元組表示, 中 01001001 01000010 中文:一個字符兩個位元組表示, Unicode:包含全世界所有的文字與二進制0101001的對應關系, a 01000001 01000010 01000011 00000001 b 01000001 01000010 01100011 00000001 中 01001001 01000010 01100011 00000001 UTF-8:包含全世界所有的文字與二進制0101001的對應關系(最少用8位一個位元組表示一個字符), a 01000001 ascii碼中的字符:一個字符一個位元組表示, To 01000001 01000010 (歐洲文字:葡萄牙,西班牙等)一個字符兩個位元組表示, 中 01001001 01000010 01100011 亞洲文字;一個字符三個位元組表示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86787.html
標籤:Python
上一篇:面試17.13恢復空格
下一篇:雜碎小知識——基礎階段
