詳解字節、字符、字符集、編碼

名詞解析:

位(bit):是計算機 內部數據 儲存的最小單位,11001100是一個八位二進制數。
字節(byte):是計算機中數據處理的基本單位,習慣上用大寫  B  來表示,1B(byte,字節)= 8bit(位)
字符:是指計算機中使用的字母、數字、字和符號。通常用來表示單個的字符,字符型必須用('')括起來。JAVA使用16位的Unicode字符集作爲編碼方式,而Unicode被設計成支持世界上所有書面語言的字符,包括中文字符。


1.1 字符與編碼的發展



ASCII碼:最初美國佬,約定了一個編碼系統,就是ASCII碼,把abc等英文字符分別和0,1,2,3,4等對應,發現差不多剛好128個數,半個字節的長度,於是乾脆取一個字節,最高位置爲0。後七位從0-127分別對每一個符號編碼。計算機每次讀取一個字節,然後參照ASCII表把這些編碼翻譯成字符。
ISO:歐洲人發現ASCII沒辦法滿足歐洲書面語言符號的需要,於是歐洲人搞一套ISO編碼,一個字節的長度,把最高位也用掉了。和ASCII表類似,計算機每次只讀一個字節,然後按照ISO表,解碼出字符。
GBK:到了我們中國,光漢字有幾萬個。於是我們整出一套GBK且兼容了ASCII編碼。

反正當時還有很多不同的編碼標準,因爲編碼不同,你不懂我、我不懂你,亂碼滿天飛。

最後國際組織把世界上所有書面語言的字符都進行了統一編號,unicode編號,這個unicode編號的集合就是字符集。

 系統內碼說明系統
階段一ASCII計算機剛開始只支持英語,其它語言不能夠在計算機上存儲和顯示。英文 DOS
階段二ANSI編碼
(本地化)

爲使計算機支持更多語言,通常使用 0x80~0xFF 範圍的 2 個字節來表示 1 個字符。比如:漢字 '中' 在中文操作系統中,使用 [0xD6,0xD0] 這兩個字節存儲。


不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個字節來代表一個字符的各種漢字延伸編碼方式,稱爲 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼。


不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。
中文 DOS,中文 Windows 95/98,日文 Windows 95/98
階段三UNICODE
(國際化)
爲了使國際間信息交流更加方便,國際組織制定了 UNICODE 字符集,爲各種語言中的每一個字符設定了統一併且唯一的數字編號,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Windows NT/2000/XP,Linux,Java

1.2 unicode和utf-8等編碼方案的聯繫

unicode編號,解決了解碼的衝突,它是一種標準,規定了每個字符對應的二進制數,或者稱它是一個具體大的映射。但是unicode並沒有規定字符對應的二進制數怎麼存儲(沒有爲編碼的二進制傳輸和二進制解碼做出規定),比如字母可能對應的數字很小,那麼轉換爲二進制數需要8位(一個字節)就夠了,但是漢字就需要14/15/16位才能表示下也就是最少需要兩個字節,甚至有些字符需要三個字節才能表示。
於是,就出現瞭如下解決方案:uft-8,utf-16,utf-32這些編碼方案。


1.3 編碼方案選擇:

utf-8這種解決方案用的最多,用得最多是因爲在當時它的方案最好,最節省資源。
utf-8採用變長編碼,編碼長度從1個字節到6個字節不等,utf-16是用兩個字節來編碼所有的字符,utf-32則選擇用4個字節來編碼

PS:目前因爲互聯網上絕大部分存在的資源都是英文的,英文在utf-16中佔2個字節,而在utf-8中則是1個字節,故utf-8更加節省資源。如果中文內容居多,則是utf-16更加節省資源。

1.4 字符,字節,字符串

 概念描述舉例
字符人們使用的記號,抽象意義上的一個符號。直接通過單個字符來指定字符型:'1', '中', 'a', '$', '¥', ……
通過轉義字符表示特殊的字符型:'\n','\t'
直接通過unicode值來表示字符型:'\uxxxx' xxxx表示一個16進制數
字節計算機中存儲數據的單元,一個8位的二進制數,是一個很具體的存儲空間。是計算機中數據處理的基本單位,習慣上用大寫  B  來表示,1B(byte,字節)= 8bit(位)0x01, 0x45, 0xFA, ……
ANSI
字符串
在內存中,如果“字符”是以 ANSI 編碼形式存在的,一個字符可能使用一個字節或多個字節來表示,那麼我們稱這種字符串爲 ANSI 字符串或者多字節字符串。"中文123"
(佔7字節)
UNICODE
字符串
在內存中,如果“字符”是以在 UNICODE 中的序號存在的,那麼我們稱這種字符串爲 UNICODE 字符串或者寬字節字符串。L"中文123"
(佔10字節)

1.5 字符集與編碼

各個國家和地區所制定的不同 ANSI 編碼標準中,都只規定了各自語言所需的“字符”。比如:漢字標準(GB2312)中沒有規定韓國語字符怎樣存儲。這些 ANSI 編碼標準所規定的內容包含兩層含義:
使用哪些字符。也就是說哪些漢字,字母和符號會被收入標準中。所包含“字符”的集合就叫做“字符集”。
規定每個“字符”分別用一個字節還是多個字節存儲,用哪些字節來存儲,這個規定就叫做“編碼”。
各個國家和地區在制定編碼標準的時候,“字符的集合”和“編碼”一般都是同時制定的。因此,平常我們所說的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”這層含義外,同時也包含了“編碼”的含義。

“UNICODE 字符集”包含了各種語言中使用到的所有“字符”。用來給 UNICODE 字符集編碼的標準有很多種,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。


參考:http://www.regexlab.com/zh/encoding.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章