如下任何言論都徹底是我的的理解,若有雷同純屬巧合,若有錯誤,但願你們多多指出,共同窗習!謝謝!java
筆者是一個理解能力偏慢、稍鑽牛角尖的程序員,什麼東西都要從最基礎理解起,一步一步向上理解,所以講述時也是這樣,講述的也比較通俗,都是按照我的的理解來說述的,也請你們少安毋躁。程序員
在計算機中不管任何數據的傳輸、存儲、持久化,都是以二進制的形式體現的。學習
那麼當我存一個字符的時候,計算機須要持久化到硬盤,或者保存在內存中。編碼
這個時候保存在內存、硬盤的數據顯然也是二進制的。.net
那麼當我須要從硬盤、內存中取出這些字符,再顯示的時候,爲何二進制會變成了字符呢?3d
這就是碼錶存在的意義。code
碼錶其實就是一個字符和其對應的二進制相互映射的一張表。blog
這張表中規定了字符和二進制的映射關係。內存
計算機存儲字符時將字符查詢碼錶,而後存儲對應的二進制。get
計算機取出字符時將二進制查詢碼錶,而後轉換成對應的字符顯示。
大體能夠這樣理解。
By the way
不一樣的碼錶所容納的字符映射也是不一樣的。
在有些碼錶中一個字符佔用1個字節,1個字節能表示的範圍是-128到127,總共爲256。因此能容納256個字符映射。
而有的碼錶中一個字符佔用2個,甚至3個字節,所以能容納的字符映射也更多。
下面筆者按照本身的理解詳細講述一下不一樣的碼錶。
常見的碼錶:
ASCII:
美國碼錶,碼錶中只有英文大小寫字母、數字、美式標點符號等。每一個字符佔用1個字節,全部字符映射的二進制都爲正數,所以有128個字符映射關係。
GB2312:
兼容ASCII碼錶,並加入了中文字符,碼錶中包含英文大小寫字母、數字、美式標點符號佔一個字節,中文佔兩個字節,中文映射的二進制都是負數,所以有128× 128 = 16384個字符映射關係。
GBK/GB18030:
兼容GB2312碼錶,英文大小寫字母、數字、美式標點符號,佔一個字節。中文佔兩個字節,第一個字節爲負數,第二個字節爲正數和負數,由於有128× 256 = 32768個字符映射關係。
Unicode碼錶:
國際碼錶,包含各國大多數經常使用字符,沒個字符都佔2個字節,所以有65536個字符映射關係。Java語言使用的就是Unicode碼錶。
UTF-8碼錶:(是Unicode編碼表的一種實現形式)
一樣是國際碼錶,但英文佔一個字節,中文佔3個字節。
實際存儲中看看具體的影響: