首頁  >  文章  >  Java  >  Java基礎入門之字符編碼

Java基礎入門之字符編碼

巴扎黑
巴扎黑原創
2017-07-21 14:40:031526瀏覽

一、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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn