【百度百科】
字符編碼(英語:Character encoding)也稱字集碼,是把字符集中的字符編碼爲指定集合中某一對象(例如:比特模式、自然數序列、8位組或者電脈衝),以便文本在計算機中存儲和通過通信網絡的傳遞。
說明白點就是如何有效的將信息通過一種大家都能識別的方式進行傳輸和閱讀,就好比兩個人同時約定用英文、德文還是中文進行通信。而對於計算機而言,無論什麼樣的編碼格式,在底層都是以01(或者高電平、低電平)的方式進行存儲和識別。沿着計算機的發展,我們先來聊聊編碼的演化過程。
【ASCII碼】
在計算機發展的早期,人們發明了ASCII碼編碼方式,當然很大程度上是由於洋人們的信息都是由abcd26個字母、阿拉伯數字和一些符號組成,所以較爲簡單的使用了ASCII碼編碼。所謂的ASCII碼就是以7位bit位存儲一個字符,加一位擴展位,總共8位組成一個Byte字節。如:
Bin(二進制) | Oct(八進制) | Dec(十進制) | Hex(十六進制) | 縮寫/字符 | 解釋 |
0000 0000 | 0 | 0 | 00 | NUL(null) | 空字符 |
0000 0001 | 1 | 1 | 01 | SOH(start of headline) | 標題開始 |
0000 0010 | 2 | 2 | 02 | STX (start of text) | 正文開始 |
0000 0011 | 3 | 3 | 03 | ETX (end of text) | 正文結束 |
0000 0100 | 4 | 4 | 04 | EOT (end of transmission) | 傳輸結束 |
0000 0101 | 5 | 5 | 05 | ENQ (enquiry) | 請求 |
0000 0110 | 6 | 6 | 06 | ACK (acknowledge) | 收到通知 |
0000 0111 | 7 | 7 | 07 | BEL (bell) | 響鈴 |
0000 1000 | 10 | 8 | 08 | BS (backspace) | 退格 |
0000 1001 | 11 | 9 | 09 | HT (horizontal tab) | 水平製表符 |
0000 1010 | 12 | 10 | 0A | LF (NL line feed, new line) | 換行鍵 |
0000 1011 | 13 | 11 | 0B | VT (vertical tab) | 垂直製表符 |
0000 1100 | 14 | 12 | 0C | FF (NP form feed, new page) | 換頁鍵 |
0000 1101 | 15 | 13 | 0D | CR (carriage return) | 回車鍵 |
0000 1110 | 16 | 14 | 0E | SO (shift out) | 不用切換 |
0000 1111 | 17 | 15 | 0F | SI (shift in) | 啓用切換 |
0001 0000 | 20 | 16 | 10 | DLE (data link escape) | 數據鏈路轉義 |
0001 0001 | 21 | 17 | 11 | DC1 (device control 1) | 設備控制1 |
0001 0010 | 22 | 18 | 12 | DC2 (device control 2) | 設備控制2 |
0001 0011 | 23 | 19 | 13 | DC3 (device control 3) | 設備控制3 |
0001 0100 | 24 | 20 | 14 | DC4 (device control 4) | 設備控制4 |
0001 0101 | 25 | 21 | 15 | NAK (negative acknowledge) | 拒絕接收 |
0001 0110 | 26 | 22 | 16 | SYN (synchronous idle) | 同步空閒 |
0001 0111 | 27 | 23 | 17 | ETB (end of trans. block) | 結束傳輸塊 |
0001 1000 | 30 | 24 | 18 | CAN (cancel) | 取消 |
0001 1001 | 31 | 25 | 19 | EM (end of medium) | 媒介結束 |
0001 1010 | 32 | 26 | 1A | SUB (substitute) | 代替 |
0001 1011 | 33 | 27 | 1B | ESC (escape) | 換碼(溢出) |
0001 1100 | 34 | 28 | 1C | FS (file separator) | 文件分隔符 |
0001 1101 | 35 | 29 | 1D | GS (group separator) | 分組符 |
0001 1110 | 36 | 30 | 1E | RS (record separator) | 記錄分隔符 |
0001 1111 | 37 | 31 | 1F | US (unit separator) | 單元分隔符 |
0010 0000 | 40 | 32 | 20 | (space) | 空格 |
0010 0001 | 41 | 33 | 21 | ! | 歎號 |
0010 0010 | 42 | 34 | 22 | " | 雙引號 |
0010 0011 | 43 | 35 | 23 | # | 井號 |
0010 0100 | 44 | 36 | 24 | $ | 美元符 |
0010 0101 | 45 | 37 | 25 | % | 百分號 |
0010 0110 | 46 | 38 | 26 | & | 和號 |
0010 0111 | 47 | 39 | 27 | ' | 閉單引號 |
0010 1000 | 50 | 40 | 28 | ( | 開括號 |
0010 1001 | 51 | 41 | 29 | ) | 閉括號 |
0010 1010 | 52 | 42 | 2A | * | 星號 |
0010 1011 | 53 | 43 | 2B | + | 加號 |
0010 1100 | 54 | 44 | 2C | , | 逗號 |
0010 1101 | 55 | 45 | 2D | - | 減號/破折號 |
0010 1110 | 56 | 46 | 2E | . | 句號 |
00101111 | 57 | 47 | 2F | / | 斜槓 |
00110000 | 60 | 48 | 30 | 0 | 數字0 |
00110001 | 61 | 49 | 31 | 1 | 數字1 |
00110010 | 62 | 50 | 32 | 2 | 數字2 |
當時人們很快發現它的侷限性,畢竟世界那麼大,語言那麼豐富,這最多的256個字符遠不能表達人們的想法。於是乎,unicode、utf-8、gb2312、gbk、base64等等多種編碼格式孕育而生。由於作者能力精力有限,只介紹幾種主流的編碼格式。
【unicode】
unicode又被稱位統一碼、萬國碼,原因就是因爲它能收錄全世界所有的語言文字符號。其原理就是將原理8位的ascii碼擴張爲16位,即2個字節,這樣就能收錄中文、日文、韓文、阿拉伯文等等所有文字,一統天下!
【java 編碼】
public static void main(String[] args) { String s = "金"; char[] c = new char[1]; c = s.toCharArray(); byte[] b; try { //獲取系統當前的編碼格式 System.out.println(System.getProperty("sun.jnu.encoding"));; //GBK 編碼 b = s.getBytes("gbk"); System.out.print("gbk:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i)) + " "); //UTF-8 編碼 b = s.getBytes("utf-8"); System.out.println(); System.out.print("utf-8:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i)) + " "); //unicode編碼 b = s.getBytes("unicode"); System.out.println(); System.out.print("unicode:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i))+ " "); //默認爲unicode System.out.println(); for (int i = 0; i < c.length; i++) { System.out.println(c[i]+":"+Integer.toHexString(c[i])); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
輸出:GBK
gbk:ffffffbd fffffff0
utf-8:ffffffe9 ffffff87 ffffff91
unicode:fffffffe ffffffff ffffff91 ffffffd1
金:91d1