在JSP中,使用get提交方式出現亂碼時,為什么要使用new String(s.getBytes("iso-8859-1"),"utf-8");?


  最近在學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 }

  先前沒有想通主要是自己沒注意到:

  1. 沒有着重的想為什么會在輸出時出現字符亂碼?
  2. 客戶端發送求時,字符轉換成字節序列時的編碼方式是什么樣的?

  總的來說,亂碼是由於編碼方式與解碼方式不一致導致的,這一句話沒有理解透!如果當時這樣想既然出現了亂碼,肯定是那邊的編碼格式和解碼格式不一致,就好了!

  注:編碼:將字符串轉換成字節序列;解碼:將字節序列轉換成字符串

  感謝:http://liguocai2009.iteye.com/blog/1602256這篇文章給我的啟發!

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM