一、ASII
美國(國家)資訊交換標準(代)碼。
電腦中只有數字,一切都是用數字表示,螢幕上顯示的一個一個的字元也不例外。
一個位元組可表示的數字為0-255,足以顯示鍵盤上的所有的字元 例如. a 為97 b為 98。這種數字與字元對應的編碼規則,稱為Asc11 碼,ASC11 碼的最高bit位元都是0,也就是說,ASC11碼的值都在0-127之間。
二、GB2312和GBK(中國的本地字元集)
中國大陸將每個中文字元都用2個位元組表示,中文字元第一個字節最高bit位都是1。這種編碼格式稱為 (gb2312) 國標碼 那麼gb2312碼對應的數字都是負數。
在此gb2312基礎上,又增了一些,比如繁體字,稱為GBK
附:
GB18030編碼是在GBK編碼基礎上的擴充,因為漢字更多,僅僅使用兩位編碼已經不能容納要求的漢字,所以採用了2\4位混和的辦法,可以支援更多的漢字編碼。
三、ANSI
為了擴充ASCII編碼,以用於顯示本國的語言,不同的國家和地區制定了不同的標準,由此產生了GB2312 , BIG5, JIS等各自的編碼標準。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼,又稱為"MBCS(Muilti-Bytes Charecter Set,多位元組字元集)"。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼,所以在中文 windows下要轉碼成gb2312,gbk只需要把文字儲存為ANSI 編碼即可。 不同 ANSI 編碼之間互不相容。
四、本地字元集
在中國大陸使用的電腦系統上, GBK和GB2312就被稱為該系統的本地字元集。
"中國 " 的中字,在中國大陸的編碼是16進制的D6D0,在台灣是 A4A4 台灣的編碼稱為BIG5 大五碼。在一個國家的本地化系統中出現的一個字符,通過電子郵件傳到另外一個國家的本地化系統中,看到的就不是那個原始字符了,而是另外一個國家的字符或亂碼。
五、Unicode編碼
ISO 組織將全世界的符號進行了統一,稱之為Unicode編碼。
「中」這個符號,在全世界都是16進位的 4e2d。 如果所有的電腦都使用Unicode編碼,則"中"這個字,在全世界上的電腦上都能顯示為"中",Unicode 編碼的字元佔用兩個位元組大小,對於AC11 碼所表示的字元,只是簡單地在AS11碼原來佔用的一個字節的前面,增中一個所有bits為0的字節, 它表示的字符的個數不會超過65535 ,實際上,它還保留了2000多個數值沒有用於編碼。
unicode 一統天下的局面還沒有形成,在相當長時間內,本地化字元編碼將與Unicode編碼共存
java中的字元使用的都是Unicode編碼。
java在透過Unicode保證跨平台的特性前提下,也支援本地平台字元集。
六、UTF-8
在java語言和其他程式的開發過程中.特別是XML 也涉及到UTF-8 UTF-16。廣義的unicode也包含 UTF8 和utf-16
UTF-8
--ASC11碼字元保持原樣,伋然只佔用一個位元組。
--對於其他國家的字元,UTF-8 使用2個或三個位元組來表示。
--使用utf-8 編碼的檔案,通常都要用 EF BB BF 作為檔案開頭的三個位元組資料。
七、UTF-8和unicode編碼之間的轉換規則
-- 0001-007f (一個位元組)
0xxxxxx
-- 0000或其泛圍在 0080 到 07ff之間的字元,
110xxxxx 10xxxxxx (11個有效bit位) (0080-07ff之間)一個unicode有16位,實際上只有11個有效位,其餘都是標誌。
-- 0800 到ffff 之間的字元,1110xxxx 10xxxxxx 10xxxxxxxxx (16位元有效位元),軟體很容易根據UTF-8 編碼中那些固定不變的bit值,來確定一個字元佔用的是一個位元組,還是兩個位元組,還是三個位元組。
八、UTF-8的優點
-- 不出現ox00 (在c語言中,\0 代表符串的結束結束標誌,說明已經到了字符串的結尾)unicode 中 對於ACS11 字元,它都要佔用兩個位元組,增加一個內容為空(0x00)的位元組,浪費,而且這個位元組,在C語言和其他程式有中特殊的應用。
-- 便於應用程式檢查資料在傳輸中是否發生了錯誤 它可以檢查出資料傳輸過程中是否出現了錯誤 。
-- 直接處理使用ASC11的文檔
九、聯通,聯想和聯
在記事本中輸入聯通聯想,聯,查看.分別會看到一些錯誤狀況
聯通(或聯絡) 出現亂碼
用ue打開,查看16進制,分別是C1AA CDA8 C1AA CFE8 //這些都是用的GB2312編碼如果是中,則是D6D0,也就是 C1AA 是聯CDA8 是通CFE8是想。可以用以下方式得到它產的二進位表示:
int x=0xCDA8; System.out.println(Integer.toBinaryString(x) );
//11000001 10101010 聯 11001101 10101000 11001101 10101000 11001101 10101000 11001101 10101000 11001101 10101000 11001101 10101000 #. GB2312來存諸的,所以"聯"字就被解析成了1100 0001 1010 1010 ,通字就被存成了1100 1101 1010 1000, 打開記事本文檔的時候,這些二進制形式, UTF-8 的規則,所以系統就認為這是一個UTF-8 編碼的文件就按UTF-8來解釋,出現了亂碼,解決的方法:保存的時候,直接按utf-8 保存就不會出現了。
第十、用程式查看字元的編碼查看中文字元的GB2312 碼
查看中文字元的UTF-8 碼
查看中文字元的Unicode 碼
public static void main(String[] args) throws UnsupportedEncodingException { String str="中国"; //查看字符的unicode码,将一个字符转成整数,得到的就是unicode值/* for(int i=0;i<str.length();i++){ int unicodeCode=str.charAt(i); System.out.println(unicodeCode); // 20013,22269 System.out.println(Integer.toHexString(unicodeCode)); //对应的16进制 4e2d,56fd }*///查看字符的gb2312码byte [] buff =str.getBytes("gb2312"); for(int i=0;i<buff.length;i++){ System.out.println(buff[i]); // -42,-48, -71,-6System.out.println(Integer.toHexString(buff[i])); //ffffffd6 ,ffffffd0 ffffffb9,fffffffa } }
以上是Java基礎入門之字符編碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!