Java字符編碼

字符編碼

1、ASCII
2、GB2312和GBK
3、ANSI
4、本地字符集
5、Unicode編碼
6、ISO-8859-1編碼
7、UTF-8
8、UTF-8和unicode編碼之間的轉換規則
9、UTF-8的優點
10、聯通,聯想和聯

  1. ASCII
    美國(國家)信息交換標準(代)碼
    計算機中只有數字,一切都是用數字表示,屏幕上顯示的一個一個的字符也不例外
    一個字節可表示的數字爲0-255,足以顯示鍵盤上的所有的字符 例如. a 爲97 b爲
    98這種數字與字符對應的編碼規則,稱爲 ASII 碼,ASC11 碼的最高bit位都是0,
    也就是說,ASC11碼的值都在0-127之間

  2. GB2312和GBK
    中國大陸將每個中文字符都用2個字節表示,中文字符每個字節最高bit位都是1
    這種編碼格式稱爲 (gb2312) 國標碼 那麼gb2312碼對應的數字都是負數在此
    gb2312基礎上,又增了一些,比如繁體字 ,稱爲 GBK附 GB18030 編碼是在GBK
    編碼基礎上的擴充,因爲漢字更多,僅僅使用兩位編碼已經不能容納要求的漢
    字,所以採用了2\4位混和的辦法,可以支持更多的漢字編碼

  3. ANSI
    爲了擴充ASCII編碼,以用於顯示本國的語言,不同的國家和地區制定了不同的
    標準,由此產生了 GB2312, BIG5,JIS 等各自的編碼標準。這些使用 2 個字節
    來代表一個字符的各種漢字延伸編碼方式,稱爲 ANSI 編碼,又稱爲
    “MBCS(Muilti-Bytes Charecter Set,多字節字符集)”。在簡體中文系統下,
    ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼,
    所以在中文 windows下要轉碼成gb2312,gbk只需要把文本保存爲ANSI編碼即可。
    不同 ANSI 編碼之間互不兼容

  4. 本地字符集
    在中國大陸使用的計算機系統上, GBK和GB2312就被稱爲該系統的本地字符集"中國 "
    的中字,在中國大陸的編碼是16進制的D6D0,在臺灣是 A4A4 臺灣的編碼稱爲BIG5 大
    五碼在一個國家的本地化系統中出現的一個字符,通過電子郵件傳到另外一個國家的
    本地化系統中,看到的就不是那個原始字符了,而是另外一個國家的字符或亂碼

  5. Unicode編碼
    ISO 組織將全世界的符號進行了統一,稱之爲Unicode編碼"中" 這個符號,在全世界都
    是16進制的 4e2d如果所有的計算機都使用Unicode編碼,則"中"這個字,在全世界上的
    計算機上都能顯示爲"中"Unicode 編碼的字符佔用兩個字節大小,對於AC11 碼所表示
    的字符,只是簡單地在AS11碼原來佔用的一個字節的前面,增中一個所有bits爲0的字節,
    它表示的字符的個數不會超過65535 ,實際上,它還保留了2000多個數值沒有用於編碼
    unicode 一統天下的局面還沒有形成,在相當長時間內,本地化字符編碼將與Unicode編
    碼共存
    java中的字符使用的都是Unicode編碼
    java在通過Unicode保證跨平臺的特性前提下,也支持本地平臺字符集

  6. ISO-8859-1編碼
    是單字節編碼,向下兼容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間完全和ASCII
    一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號。收錄的字符除ASCII收錄
    的字符外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號。歐
    元符號出現的比較晚,沒有被收錄在ISO-8859-1當中。
    因爲ISO-8859-1編碼範圍使用了單字節內的所有空間,在支持ISO-8859-1的系統中傳輸和
    存儲其他任何編碼的字節流都不會被拋棄。換言之,把其他任何編碼的字節流當作ISO-8859-1
    編碼看待都沒有問題。這是個很重要的特性,MySQL數據庫默認編碼是Latin1就是利用了這
    個特性。
    ASCII編碼是一個7位的容器,ISO-8859-1編碼是一個8位的容器。
    HTML 4.01 支持 ISO 8859-1 (Latin-1) 字符集

  7. UTF-8
    在java語言和其他程序的開發過程中.特別是XML 還涉及到UTF-8 UTF-16
    廣義上的 unicode也包含 UTF8 和utf-16
    UTF-8
    –ASC11碼字符保持原樣,仍然只佔用一個字節
    對於其他國家的字符,
    –UTF-8 使用兩個或三個字節來表示,
    –使用utf-8 編碼的文件,通常都要用 EF BB BF 作爲文件開頭的三個字節數據

  8. UTF-8和unicode編碼之間的轉換規則
    – 0001-007f (一個字節)
    0xxxxxx

– 0000或其泛圍在 0080 到 07ff之間的字符,
110xxxxx 10xxxxxx (11個有效bit位) (0080-07ff之間)一個unicode有16位,
實際上只有11個有效位,其餘都是標誌位
– 0800 到 ffff 之間的字符,
1110xxxx 10xxxxxx 10xxxxxx (16比特有效位)
通過上圖,可以看到.軟件很容易根據UTF-8 編碼中那些固定不變的bit值,
來確定一個字符佔用的是一個字節,還是兩個字節,還是三個字節

  1. UTF-8的優點
    – 不出現0x00 (在c語言中,\0 代表符串的結束結束標誌,說明已經到了字符串的末尾)
    unicode 中 對於ACS11 字符,它都要佔用兩個字節,增加一個內容爲空(0x00)的字節,
    浪費,而且這個字節,在C語言和其他程序有中特殊的應用
    – 便於應用程序檢查數據在傳輸中是否發生了錯誤
    – 直接處理使用ASC11的文檔

  2. 聯通,聯想和聯
    用UE查看 漢字對應的碼編

C1 AA CD A8 == 聯通

C1 AA CF EB == 聯想

C1 AA CF B5 == 聯繫

查看這些編碼對應的二進制表示
int x=0xC1AA;
System.out.println(Integer.toBinaryString(x)); //1100000110101010聯
聯:1100000110101010
通:1100110110101000
想:1100111111101011
系:1100111110110101
110-00001 10-101010 110-01101 10-101000
記事本中的文件,默認是按中文字符集GB2312來存諸的,
所以"聯"字就被解析成了 1100 0001 1010 1010
,通字就被存成了 1100 1101 1010 1000, 打開記事本文檔的時候,這些二進制形式,
恰好都都對應上了 UTF-8 的規則,所以系統就認爲這是一個UTF-8 編碼的文件 就按UTF-8來解釋,
出現了亂碼,解決的方法:保存的時候,直接按utf-8 保存就不會出現了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章