JVM類載入機制
目錄
一:字元編碼知識儲備
1.程式執行與三大核心硬體的關係
2.程式執行過程中產生的資料最先放在記憶體中
3.python程式執行的三個步驟
python3 D:\a.py
1.先啟動python直譯器
2.直譯器會將a.py的內容當成普通內容從硬碟讀入記憶體,此時沒有語法意義
3.直譯器會解釋執行剛剛讀入記憶體的內容,開始識別python語法
二:什麼是字元編碼
字元------------------(標準)------------------- 數字 gbk utf-8
字元編碼表:存放的是字元與數字的對應關係
1.ASCII: 只能識別英文字元
特點: 採用9bit對應一個英文字元
8bit = 1byte
2、GBK:可以識別中文字串與英文字元
特點:採用16bit對應字元,該字元可以是英文字元、也可以是中文字元
3、shift-JIS: 可以識別日文和英文
4、unicode:可以識別萬國字元
特點:2Bytes對應一個字元
字元-----》unicode格式的數字
|
GBK shiftJIS
中文字元、英文字元------------》unicode二進位制數-----------》gbk二進位制數
日文字元、英文字元------------》unicode二進位制數-----------》shiftJIS二進位制數
韓文字元、英文字元------------》unicode二進位制數-----------》Euc-kr二進位制數
萬國字元------------》unicode二進位制數-----------》utf-8二進位制數
5、為什麼不直接用utf-8
1Byte對應英文字元
3Byte對應一箇中文字元
utf-8是針對Unicode的可變長度字元編碼:一個英文字元佔1Bytes,一箇中文字元佔3Bytes,生僻字用更多的Bytes儲存
unicode更像是一個過渡版本,我們新開發的軟體或檔案存入硬碟都採用utf-8格式,等過去幾十年,所有老編碼的檔案都淘汰掉之後,會出現一個令人開心的場景,即硬盤裡放的都是utf-8格式,此時unicode便可以退出歷史舞臺,記憶體裡也改用utf-8,天下重新歸於統一
三.字元編碼發展史
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
"""
編碼:
字元------編碼------>Unicode格式的數字-----編碼----->gbk格式的數字
字元------編碼------->Unicode格式的數字-----解碼-------gbk格式的數字
在python3中字串型別的值在記憶體中都是unicode格式的數字
x="上"
print(x)
在python2中字串型別的值在記憶體中都是檔案頭指定編碼格式的數字
x=u"上" # 如果在字串前加字首u就把字串強制存成unicode格式,推薦使用
print([x,])
print(x)
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))