Java中的字符集編碼入門(二)編碼字符集與字符集編碼的區別

 

須要再一次強調的是,不管歷史上的UCS仍是現現在的Unicode,二者指的都是編碼字符集,而不是字符集編碼。花費一點時間來理解好這件事,而後你會發現對全部網頁的,系統的,編碼標準之間的來回轉換等等繁瑣事務都會思路清晰,手到擒來。php

 

首先說說最通常意義上的字符集。app

 

一個抽象字符集其實就是指字符的集合,例如全部的英文字母是一個抽象字符集,全部的漢字是一個抽象字符集,固然,把全世界全部語言的符號都放在一塊兒,也能夠稱爲一個抽象字符集,因此這個劃分是至關人爲的。之因此說「抽象」二字,是由於這裏所說起的字符不是任何具體形式的字符,拿漢字中的「漢」這個字符來講,您在這篇文章中看到的這個「漢」實際上是這個字符的一種具體表現形式,是它的圖像表現形式,並且它是用中文(而非拼音)書寫而成,使用宋體外觀;而當人們用嘴發出「漢」這個音的時候,他們是在使用「漢」的另外一種具體表現形式——聲音,但不管如何,二者所指的字符都是「漢」這個字。同一個字符的表現形式可能有無數種(點陣表示,矢量表示,音頻表示,楷體,草書等等等等),把每一種表現形式下的同一個字符都歸入到字符集中,會使得集合過於龐大,冗餘高,也很差管理。所以抽象字符集中的字符,都是指惟一存在的抽象字符,而忽略它的具體表現形式。編碼

 

抽象字符集中的諸多字符,沒有順序之分,誰也不能說哪一個字符在哪一個字符前面,並且這種抽象字符只有人能理解。在給一個抽象字符集合中的每一個字符都分配一個整數編號以後(注意這個整數並無要求大小),這個字符集就有了順序,就成爲了編碼字符集。同時,經過這個編號,能夠惟一肯定到底指的是哪個字符。固然,對於同一個字符,不一樣的字符集編碼系統所制定的整數編號也不盡相同,例如「兒」這個字,在Unicode中,它的編號是0x513F,(爲方便起見,以十六進制表示,但這個整數編號並不要求必須是以十六進制表示)意思是說它是Unicode這個編碼字符集中的第0x513F個字符。而在另外一種編碼字符集好比Big5中,這個字就是第0xA449個字符了。這種狀況的另外一面是,許多字符在不一樣的編碼字符集中被分配了相同的整數編號,例如英文字母「A」,在ASCIIUnicode中,均是第0x41個字符。咱們常說的Unicode字符集,指的就是這種被分配了整數編號的字符集合,但要澄清的是,編碼字符集中字符被分配的整數編號,不必定就是該字符在計算機中存儲時所使用的值,計算機中存儲的字符到底使用什麼二進制整數值來表示,是由下面將要說到的字符集編碼決定的。spa

 

字符集編碼決定了如何將一個字符的整數編號對應到一個二進制的整數值,有的編碼方案簡單的將該整數值直接做爲其在計算機中的表示而存儲,例如英文字符就是這樣,幾乎全部的字符集編碼方案中,英文字母的整數編號與其在計算機內部存儲的二進制形式都一致。但有的編碼方案,例如適用於Unicode字符集的UTF-8編碼形式,就將很大一部分字符的整數編號做了變換後存儲在計算機中。以「漢」字爲例,「漢」的Unicode值爲0x6C49,但其編碼爲UTF-8格式後的值爲0xE6B189(注意到變成了三個字節)。這裏只是舉個例子,關於UTF-8的詳細編碼規則能夠參看《Mapping codepoints to Unicode encoding forms》一文,URLhttp://scripts.sil.org/cms/scripts/page.phpsite_id=nrsi&item_id=IWS-AppendixA#sec3.咱們常常據說的另外一種編碼方案UTF-16,則對Unicode中的前65536個字符編號都不作變換,直接做爲計算機存儲時使用的值(對65536之後的字符,仍然要作變換),例如「漢」字的Unicode編號爲0x6C49,那麼通過UTF-16編碼後存儲在計算機上時,它的表示仍爲0x6C49!。我猜,正是由於UTF-16的存在,使得不少人認爲Unicode是一種編碼(實際上,是一個字符集,再次重申),也所以,不少人說Unicode的時候,他們實際上指的是UTF-16.UTF-16提供了surrogate pair機制,使得Unicode中碼位大於65536的那些字符得以表示。code

 

Surrogate pair機制在目前來講實在不經常使用,甚至連一些UTF-16的實現都不支持,因此我不打算在這裏多加討論,其基本的思想就是用兩個16位的編碼表示一個字符(注意,只對碼位超過65536的字符這麼作)。Unicode如此死抱着16這個數字不放,有歷史的緣由,也有實用的緣由。orm

 

固然還有一種最強的編碼,UTF-32,他對全部的Unicode字符均不作變換,直接使用編號存儲!(俗稱的以不變應萬變),只是這種編碼方案太浪費存儲空間(就連1個字節就能夠搞定的英文字符,它都必須使用4個字節),於是儘管使用起來方便(不須要任何轉換),卻沒有獲得普及。事務

 

記得當初UnicodeUCS還沒成家之時,UCS也是須要人愛,須要人疼的,沒有本身的字符集編碼怎麼成。UCS-2UCS-4就扮演了這樣的角色。UCS-4UTF-32除了名字不一樣之外,思想徹底同樣。而UCS-2UTF-16在對前65536個字符的處理上也徹底相同,惟一的區別只在於UCS-2 不支持surrogate pair機制,便是說,UCS-2只能對前65536個字符編碼,對其後的字符毫無辦法。不過如今再談起字符編碼的時候,UCS-2UCS-4早已成爲計算機史學家纔會用到的詞彙,就讓它們繼續留在故紙堆裏吧。ip

 

下一節咱們來講說與中文相關的GB2312GBK.ci

相關文章
相關標籤/搜索