以下任何言論都完全是個人的理解,如有雷同純屬巧合,如有錯誤,希望大家多多指出,共同學習!謝謝!
筆者是一個理解能力偏慢、稍鑽牛角尖的程序員,什么東西都要從最基礎理解起,一步一步向上理解,因此講述時也是這樣,講述的也比較通俗,都是按照個人的理解來講述的,也請大家少安毋躁。
在計算機中無論任何數據的傳輸、存儲、持久化,都是以二進制的形式體現的。
那么當我存一個字符的時候,計算機需要持久化到硬盤,或者保存在內存中。
這個時候保存在內存、硬盤的數據顯然也是二進制的。
那么當我需要從硬盤、內存中取出這些字符,再顯示的時候,為什么二進制會變成了字符呢?
這就是碼表存在的意義。
碼表其實就是一個字符和其對應的二進制相互映射的一張表。
這張表中規定了字符和二進制的映射關系。
計算機存儲字符時將字符查詢碼表,然后存儲對應的二進制。
計算機取出字符時將二進制查詢碼表,然后轉換成對應的字符顯示。
大致可以這樣理解。
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個字節。
實際存儲中看看具體的影響: