標籤:java 編碼
引入編碼的原因:電腦只能儲存位元。所以要存放字元,就要存放對應碼錶數位位元。
並不是直接存入對應的字元輪廓。顯示的時候也是將位元轉換為十進位數字,去尋找對應碼錶
來進行解碼。
ASCII:第一張碼錶,只兼顧了拉丁字元和常用符號
a--97 z--122 A--65 Z--90
0--48 1--49 9--57
該碼錶一共有128對,0-127的數字,每個數字代表一個字元。一個字元代表一個位元組。
該碼錶對應7位位元,但電腦處理的基本單位是一個位元組,也就是8位,因此最高位都用0來代替。
後來字元不夠用,就將其擴充128個字元,也就是256字元。最高位都是1。將其稱為擴充ASCII碼。
gb2312:中國自己制定的碼錶,0-127數字是ASCII編碼,之後就是一些中文字元,其中也包含ASCII碼中原有的一些符號,但這些符號都佔用了兩個位元組,
就是常說的“全形“符號,ASCII碼中的就叫做”半形“字元。該碼錶包含簡體中文。
gbk:也是中國的碼錶,在gb2312的基礎上。包含繁體字。
gb18030:在gbk的基礎上,囊括了大多數少數民族常用字元。
在以上中國碼錶中,數字字母均為1個位元組,漢字為兩個位元組。
unicode:也叫萬國碼。包含世界上大多數文字。java的預設碼錶,它是16位的碼錶。在java中是用兩個位元組來表示一個字元。
對於ASCII裡的那些“半形”字元,unicode保持其原編碼不變,只是將其長度由原來的8位擴充為16位,而其他文化和語言的字元則全部重新統一編碼。
由於unicode規定所有字元佔兩個位元組,原本英文字元在ASCII碼中只需要一個位元組就能儲存,現在確需要浪費一半的空間來儲存,對資源是一種極大的浪費。
utf-8:是在互連網上使用最廣的一種unicode的實現方式,這是為傳輸而設計的編碼,並使編碼無國界,UTF-8是一種可變的編碼方式。
它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度,當字元在ASCII碼的範圍時,就用一個位元組表示,
保留了ASCII字元一個位元組的編碼做為它的一部分,UTF-8一個中文字元佔3個位元組。從unicode到uft-8並不是直接的對應,而是要過一些演算法和規則來轉換。
在以上碼錶中中文所對應的位元不都相同,因此可以得出中文亂碼產生的根本原因就是編碼和解碼用了不同的碼錶。
位元組的是byte,位是bit,1 byte = 8 bit ,也就是一個位元組有8位。
“位元組”是一個8位的實體儲存體單元,而“字元”則是一個文化相關的符號。
java......關於編碼