Java代碼
表1-4 GB2312 字符編碼分布表
GB2312字符在計算機中存儲是以其區(qū)位碼為基礎的,,其中漢字的區(qū)碼和位碼分別占一個存儲單元,每個漢字占兩個存儲單元,。由于區(qū)碼和位碼的取值范圍都是在1-94之間,,這樣的范圍同西文的存儲表示沖突。例如漢字‘珀’在GB2312中的區(qū)位碼為7174,,其兩字節(jié)表示形式為71,,74;而兩個西文字符‘GJ’的存儲碼也是71,74,。這種沖突將導致在解釋編碼時到底表示的是一個漢字還是兩個西文字符將無法判斷,。
這也就是一些操作byte來進行漢字操作的程序員經(jīng)常分出半個漢字的原因了!
GB2312編碼用兩個字節(jié)(8位2進制)表示一個漢字,所以理論上最多可以表示256×256=65536個漢字,。但這種編碼方式也僅僅在中國行得通,,如果您的網(wǎng)頁使用的GB2312編碼,,那么很多外國人在瀏覽你的網(wǎng)頁時就可能無法正常顯示,因為其瀏覽器不支持GB2312編碼,。當然,,中國人在瀏覽外國網(wǎng)頁(比如日文)時,也會出現(xiàn)亂碼或無法打開的情況,,因為我們的瀏覽器沒有安裝日文的編碼表,。
Big5編碼
表1-5 Big5字符編碼分布表
Big5編碼的分布如表1-5所示,Big5字符主要部分集中在三個段內(nèi):標點符號,、希臘字母及特殊符號,;常用漢字;非常用漢字,。其余部分保留給其他廠商支持,。
Big5編碼推出后,得到了繁體中文軟件廠商的廣泛支持,,在使用繁體漢字的地區(qū)迅速普及使用,。目前,Big5編碼在臺灣,、香港,、澳門及其他海外華人中普遍使用,成為了繁體中文編碼的事實標準,。在互聯(lián)網(wǎng)中檢索繁體中文網(wǎng)站,,所打開的網(wǎng)頁中,大多都是通過Big5編碼產(chǎn)生的文檔,。
Unicode編碼(統(tǒng)一用3個字節(jié))應為編碼方式各自為政.如果有一種編碼,,將世界上所有的符號都納入其中,,無論是英文,、日文、還是中文等,,大家都使用這個編碼表,,就不會出現(xiàn)編碼不匹配現(xiàn)象。每個符號對應一個唯一的編碼,,亂碼問題就不存在了,。這就是Unicode編碼。
Unicode當然是一個很大的集合,,現(xiàn)在的規(guī)??梢匀菁{100多萬個符號。每個符號的編碼都不一樣,比如,,U+0639表示阿拉伯字母Ain,,U+0041表示英語的大寫字母A,“漢”這個字的Unicode編碼是U+6C49,。
Unicode固然統(tǒng)一了編碼方式,,但是它的效率不高,比如UCS-4(Unicode的標準之一)規(guī)定用4個字節(jié)存儲一個符號,,那么每個英文字母前都必然有三個字節(jié)是0,,這對存儲和傳輸來說都很耗資源。
UTF-8編碼(根據(jù)編碼的長短來自動確定占用空間.)
為了提高Unicode的編碼效率,,于是就出現(xiàn)了UTF-8編碼,。UTF-8可以根據(jù)不同的符號自動選擇編碼的長短。比如英文字母可以只用1個字節(jié)就夠了,。 UTF-8的編碼是這樣得出來的,,以”漢”這個字為例:
“漢”字的Unicode編碼是U+00006C49,然后把U+00006C49通過UTF-8編碼器進行編碼,,最后輸出的UTF-8編碼是E6B189,。
Base64編碼
有的電子郵件系統(tǒng)(比如國外信箱)不支持非英文字母(比如漢字)傳輸, Base64編碼這是歷史原因造成的(認為只有美國會使用電子郵件?),。因為一個英文字母使用ASCII編碼來存儲,,占存儲器的1個字節(jié)(8位),實際上只用了7位2進制來存儲,,第一位并沒有使用,,設置為0,所以,,這樣的系統(tǒng)認為凡是第一位是1的字節(jié)都是錯誤的,。而有的編碼方案(比如GB2312)不但使用多個字節(jié)編碼一個字符,并且第一位經(jīng)常是1,,于是郵件系統(tǒng)就把1換成0,,這樣收到郵件的人就會發(fā)現(xiàn)郵件亂碼。
為了能讓郵件系統(tǒng)正常的收發(fā)信件,,就需要把由其他編碼存儲的符號轉(zhuǎn)換成ASCII碼來傳輸,。比如,在一端發(fā)送GB2312編碼->根據(jù)Base64規(guī)則->轉(zhuǎn)換成ASCII碼,,接收端收到ASCII碼->根據(jù)Base64規(guī)則->還原到GB2312編碼,。
|
|