1. 程式人生 > >java......關於編碼

java......關於編碼

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......關於編碼