1. 程式人生 > 實用技巧 >JVM類載入機制

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))