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

2021-08-30 04:07:10 字數 1666 閱讀 8188

需要再一次強調的是,無論歷史上的ucs還是現如今的unicode,兩者指的都是編碼字符集,而不是字符集編碼。花費一點時間來理解好這件事,然後你會發現對所有網頁的,系統的,編碼標準之間的來回轉換等等繁雜事務都會思路清晰,手到擒來。

首先說說最一般意義上的字符集。

乙個抽象字符集其實就是指字元的集合,例如所有的英文本母是乙個抽象字符集,所有的漢字是乙個抽象字符集,當然,把全世界所有語言的符號都放在一起,也可 以稱為乙個抽象字符集,所以這個劃分是相當人為的。之所以說「抽象」二字,是因為這裡所提及的字元不是任何具體形式的字元,拿漢字中的「漢」這個字元來 說,您在這篇文章中看到的這個「漢」其實是這個字元的一種具體表現形式,是它的影象表現形式,而且它是用中文(而非拼音)書寫而成,使用宋體外觀;而當人 們用嘴發出「漢」這個音的時候,他們是在使用「漢」的另一種具體表現形式——聲音,但無論如何,兩者所指的字元都是「漢」這個字。同乙個字元的表現形式可 能有無數種(點陣表示,向量表示,音訊表示,楷體,草書等等等等),把每一種表現形式下的同乙個字元都納入到字符集中,會使得集合過於龐大,冗餘高,也不 好管理。因此抽象字符集中的字元,都是指唯一存在的抽象字元,而忽略它的具體表現形式。

抽象字符集中的諸多字元,沒有順序之分,誰也不能說哪個字元在哪個字元前面,而且這種抽象字元只有人能理解。在給乙個抽象字元集合中的每個字元都分配乙個 整數編號之後(注意這個整數並沒有要求大小),這個字符集就有了順序,就成為了編碼字符集。同時,通過這個編號,可以唯一確定到底指的是哪乙個字元。當 然,對於同乙個字元,不同的字符集編碼系統所制定的整數編號也不盡相同,例如「兒」這個字,在unicode中,它的編號是0x513f,(為方便起見, 以十六進製制表示,但這個整數編號並不要求必須是以十六進製制表示)意思是說它是unicode這個編碼字符集中的第0x513f個字元。而在另一種編碼字元 集比如big5中,這個字就是第0xa449個字元了。這種情況的另一面是,許多字元在不同的編碼字符集中被分配了相同的整數編號,例如英文本母「a」, 在ascii及unicode中,均是第0x41個字元。我們常說的unicode字符集,指的就是這種被分配了整數編號的字元集合,但要澄清的是,編碼 字符集中字元被分配的整數編號,不一定就是該字元在計算機中

儲存時所使用的值,計算機中

儲存的字元到底使用什麼二進位制整數值來表示,是由下面將要說到的字符集編碼決定的。

surrogate pair機制在目前來說實在不常用,甚至連一些utf-16的實現都不支援,所以我不打算在這裡多加討論,其基本的思想就是用兩個16位的編碼表示乙個字 符(注意,只對碼位超過65536的字元這麼做)。unicode如此死抱著16這個數字不放,有歷史的原因,也有實用的原因。

當然還有一種最強的編碼,utf-32,他對所有的unicode字元均不做變換,直接使用編號儲存!(俗稱的以不變應萬變),只是這種編碼方案太浪費存 儲空間(就連1個位元組就可以搞定的英文本元,它都必須使用4個位元組),因而儘管使用起來方便(不需要任何轉換),卻沒有得到普及。

記得當初unicode與ucs還沒成家之時,ucs也是需要人愛,需要人疼的,沒有自己的字符集編碼怎麼成。ucs-2與ucs-4就扮演了這樣的角 色。ucs-4與utf-32除了名字不同以外,思想完全一樣。而ucs-2與utf-16在對前65536個字元的處理上也完全相同,唯一的區別只在於 ucs-2 不支援surrogate pair機制,即是說,ucs-2只能對前65536個字元編碼,對其後的字元毫無辦法。不過現在再談起字元編碼的時候,ucs-2與ucs-4早已成為 計算機史學家才會用到的詞彙,就讓它們繼續留在故紙堆裡吧。

Java 字符集,編碼 解碼

1 計算機中檔案 資料底層都是基於二進位制的。字符集 包含著字元和二進位制序列之間的對應關係,乙個字元對應乙個二進位制序列。編碼 encode 把人能看懂的明文轉換為計算機能理解二進位制序列。解碼 decode 把計算機中的二進位制序列轉換為人能看懂的明文。亂碼 解碼方式與編碼方式不同,即編碼 解碼...

字符集 編碼

字符集概念 1 字符集 可以表示的字元和字元對應計算機位元組碼的對映 2 字元編碼方式 計算機中用來表示和傳輸如前所述字符集中對映的位元組碼的編碼方式。對於ascii和gb2312等字符集,他們在傳輸和計算機表示時的位元組碼不用編碼,直接用字元對應的位元組碼表示。但比如unicode 字符集,就有多...

字符集編碼

喬哥 小萌,聽說你去面試了,怎麼樣啊?小萌 哎 喬哥,你給我講講什麼是字符集和編碼唄,ascii,utf 8,utf 16,utf 32又是啥?喬哥 好的,在搞懂字符集先來講講什麼是編碼吧 在計算機底層,比如說你的名字 小萌 在計算機中並不是文字的形式,而是一串二進位制數字,如 0110011001...