名詞解析:
位(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 編碼。 | 中文 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