爲何要編碼
- 計算機中存儲信息的最小單元是一個字節即 8 個 bit,因此能表示的字符範圍是 0~255 個。
- 人類要表示的符號太多,沒法用一個字節來徹底表示。
- 要解決這個矛盾必須須要一個新的數據結構 char,從 char 到 byte 必須編碼。
常見編碼格式
編碼 |
描述 |
ASCII |
ASCII 碼,總共有 128 個,用一個字節的低 7 位表示,0~31 是控制字符如換行回車刪除等;32~126 是打印字符,能夠經過鍵盤輸入而且可以顯示出來。 |
ISO-8859-1(擴展ASCII編碼) |
128 個字符顯然是不夠用的,因而 ISO 組織在 ASCII 碼基礎上又制定了一些列標準用來擴展 ASCII 編碼,它們是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵蓋了大多數西歐語言字符,因此應用的最普遍。ISO-8859-1 仍然是單字節編碼,它總共能表示 256 個字符。 |
GB2312 |
它的全稱是《信息交換用漢字編碼字符集 基本集》,它是雙字節編碼,總的編碼範圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。 |
GBK(擴展GB2312) |
全稱叫《漢字內碼擴展規範》,是國家技術監督局爲 windows95 所制定的新的漢字內碼規範,它的出現是爲了擴展 GB2312,加入更多的漢字,它的編碼範圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字,它的編碼是和 GB2312 兼容的,也就是說用 GB2312 編碼的漢字能夠用 GBK 來解碼,而且不會有亂碼。 |
GB18030(兼容GB2312) |
全稱是《信息交換用漢字編碼字符集》,是我國的強制標準,它多是單字節、雙字節或者四字節編碼,它的編碼與 GB2312 編碼兼容,這個雖然是國家標準,可是實際應用系統中使用的並不普遍。 |
Unicode編碼集 |
ISO 試圖想建立一個全新的超語言字典,世界上全部的語言均可以經過這本字典來相互翻譯。Unicode 是 Java 和 XML 的基礎。 |
UTF-16 |
UTF-16 具體定義了 Unicode 字符在計算機中存取方法。UTF-16 用兩個字節來表示 Unicode 轉化格式,這個是定長的表示方法,不論什麼字符均可以用兩個字節表示,兩個字節是 16 個 bit,因此叫 UTF-16。UTF-16 表示字符很是方便,每兩個字節表示一個字符,這個在字符串操做時就大大簡化了操做,這也是 Java 以 UTF-16 做爲內存的字符存儲格式的一個很重要的緣由。 |
UTF-8 |
UTF-16兩個字節表示一個字符,雖然在表示上很是簡單方便,可是也有其缺點,有很大一部分字符用一個字節就能夠表示的如今要兩個字節表示,存儲空間放大了一倍,在如今的網絡帶寬還很是有限的今天,這樣會增大網絡傳輸的流量,並且也不必。而 UTF-8 採用了一種變長技術,每一個編碼區域有不一樣的字碼長度。不一樣類型的字符能夠是由 1~6 個字節組成。若是一個字節,最高位(第 8 位)爲 0,表示這是一個 ASCII 字符(00 - 7F)。可見,全部 ASCII 編碼已是 UTF-8 了。 若是一個字節,以 11 開頭,連續的 1 的個數暗示這個字符的字節數,例如:110xxxxx 表明它是雙字節 UTF-8 字符的首字節。 若是一個字節,以 10 開始,表示它不是首字節,須要向前查找才能獲得當前字符的首字節 |
java 默認字符集
- java採用的編碼是unicode編碼。java字符串使用的是unicode編碼。
- jvm的默認編碼,可使用
System.out.println(Charset.defaultCharset());
來查看jvm默認的字符集。JVM的字符集編碼取的是操做系統默認的字符集編碼。
- Java文件編譯後造成的class文件編碼是Unicode編碼(具體說是UTF-16編碼)。無論在編譯前java文件使用何種編碼,在編譯後成class後,他們都是同樣的----Unicode編碼表示。
javac 指定編碼
javac -encoding "文件編碼" 源代碼.java
參考