一、字符串的編碼和解碼java
如下是對字符串進行編碼:編碼
//Convert from String to byte[]: String s = "中國"; byte[] b = s.getBytes("UTF-8"); for(byte i:b){ System.out.print(i+","); }
輸出:code
-28,-72,-83,-27,-101,-67,
如何解碼:(解碼時首先要明白是採用什麼方式編碼的) 如上咱們知道採用UTF-8格式進行編碼的,那麼就採用UTF-8格式進行解碼:utf-8
//Convert from byte[] to String: byte[] t = {-28,-72,-83,-27,-101,-67}; String tt = new String(t,"UTF-8"); System.out.println(tt);
輸出:字符串
中國
假如咱們解碼的時候採用GBK進行解碼,就會出現亂碼:get
//Convert from byte[] to String: byte[] t = {-28,-72,-83,-27,-101,-67}; String tt = new String(t,"GBK"); System.out.println(tt);
以上採用GBK方式進行解碼,出現亂碼,輸出爲:string
涓浗
注意事項it
1.控制檯的輸出也會有對應的編碼格式,這個編碼格式是支持輸出的字符串的顯示的編碼。好比UTF-8表明中文的輸出也能夠打印,若是改成:ISO-8859-1,中文就沒法顯示了,由於,ISO-8859-1沒法對中文進行編碼。 2.因此控制檯儘可能採用UTF-8格式,這樣幾乎全部的輸出都可以看到。io
理論上經過經過編碼格式A編碼,再經過編碼格式A解碼,就不會出現亂碼。注意:前提是編碼格式A必必須可以進行編碼和解碼。若是A不可以進行編碼,即便經過A進行解碼也會出現亂碼。字符編碼
舉個例子: 你是一個廚師,只會對蔬菜、水果、肉類這三種物品進行作菜。
這時候給你:蘋果、橘子、白菜、蘿蔔、豬肉、羊肉你均可以進行分類,再給你一個 屠龍刀,你傻了。這屠龍刀是哪個分類?如何作菜?
這時候你的分類爲: 、
蔬菜:白菜、蘿蔔 肉類:豬肉、羊肉 水果類:橘子、蘋果
??? :屠龍刀
屠龍刀你不知道怎麼辦,就打了三個大大的問號 ??? 因此就會出現亂碼了:
下面我舉個例子:灰常形象:
//Convert from String to byte[]: String s = "中國"; byte[] b = s.getBytes("big5"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"big5"); System.out.println(tt);
輸出:
-92,-92,63, 中?
分析輸出結果 用big5編碼再用big5解碼爲何會輸出 「中?」呢
就是由於 "國" 在big5編碼格式中不能順利編碼,就是big5編碼格式中不能對 「國」 字進行編碼,因此亂碼了。
若是改成GBK或者UTF-8就能夠了,由於GBK或者UTF-8可以順利對 「國」 字進行編碼和解碼 以下:
//Convert from String to byte[]: String s = "中國"; byte[] b = s.getBytes("GBK"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"GBK"); System.out.println(tt);
輸出結果:
-42,-48,-71,-6, 中國
總結: 不出現亂碼的幾個條件 一、編碼格式可以兼容對應的 被編碼者 二、在第一條的基礎上,用A編碼格式編碼就要用A編碼格式進行解碼。 三、輸出的結果和對應的平臺也要支持對應的編碼格式
兩種編碼格式都可以兼容的,採用A編碼格式編碼,再用B編碼格式解碼也能夠正常顯示,由於A、B都兼容,若是常規的ASCII編碼, LFFFFF1112中111111
這種方式嚴重不建議,沒啥意義
//Convert from String to byte[]: String s = "LFFFFF1112中111111"; byte[] b = s.getBytes("gb2312"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"UTF-8"); System.out.println(tt);
輸出:除了中文部分,都可以正常顯示,由於中文部分gb2312和UTF-8不是採用同一種編碼格式
76,70,70,70,70,70,49,49,49,50,-42,-48,49,49,49,49,49,49, LFFFFF1112��111111
說明幾點 一、工做空間的編碼格式,只是表明你編寫程序的時候能夠輸入的編碼,好比UTF-8就表明 String a = "你好" 可以正常顯示,若是你把工做空間編碼格式修改成:ISO-8859-1,你們都知道ISO-8859-1不支持中文,這樣就會顯示亂碼: String a = "ä½ å¥½" ;但最好設置爲UTF-8由於可以輸入任何形式的內容。
二、控制檯輸出的編碼格式也能夠調,但最好設置爲UTF-8格式,由於你可以輸出任何形式的內容
引用文章: