最近在學JSP,在學習處理get方式提交數據出現亂碼問題的時候,對其中的一個解決方法new String(s.getBytes("iso-8859-1"),"utf-8");產生了疑問,就是為什么要使用s.getBytes("iso-8859-1")?
當時只這樣想的:客戶端向服務器發送一個請求,比如說是一個字符串"請求";之后服務器接收到這個請求,也就是這個字符串,可是這時由於某種原因出現了亂碼!這時為了解決這個問題,使用new String(s.getBytes("iso-8859-1"),"utf-8");解決問題。看到這條語句,我感覺想不通啊,字符使用iso-8859-1編碼取得字節序列,再由utf-8解碼取得字符串,得到的還是亂碼啊!怎么會取得正確的字符呢!!!想不通啊!
之后,通過查找資料,得到了一點想法,代碼如下:
1 public class ThinkIng { 2 public static void main(String[] args) throws Exception { 3 System.out.println("\t------JSP模擬------"); 4 System.out.println("客戶端,有一個中文字符的請求(轉換成了字節序列發送),發送至服務器端"); 5 String request="請求"; 6 byte[] client=request.getBytes();//客戶端的請求的字節序列 7 print(client); 8 System.out.println();//分割用的 9 System.out.println("有一中間件,將發送的字符序列一默認的編碼格式(iso-8859-1)進行解碼"); 10 String sever=new String(client,"iso-8859-1"); 11 System.out.println(sever); 12 System.out.println("程序猿發現,這邊有問題,中文有亂碼,前來解決!"); 13 String debug=new String(sever.getBytes("iso-8859-1"),"gbk");//還原字節序列,使用“gbk”重新進行解碼! 14 System.out.println(debug); 15 System.out.println("問題解決!"); 16 } 17 public static void print(byte[] b){//用於顯示字節序列的 18 for(byte b1:b){ 19 System.out.print(Integer.toHexString(b1 & 0xff)+" "); 20 } 21 } 22 }
先前沒有想通主要是自己沒注意到:
- 沒有着重的想為什么會在輸出時出現字符亂碼?
- 客戶端發送求時,字符轉換成字節序列時的編碼方式是什么樣的?
總的來說,亂碼是由於編碼方式與解碼方式不一致導致的,這一句話沒有理解透!如果當時這樣想既然出現了亂碼,肯定是那邊的編碼格式和解碼格式不一致,就好了!
注:編碼:將字符串轉換成字節序列;解碼:將字節序列轉換成字符串
感謝:http://liguocai2009.iteye.com/blog/1602256這篇文章給我的啟發!