在JSP中,使用get提交方式出現亂碼時,為什麼要使用new String(s.getBytes("iso-8859-1"),"utf-8");?
阿新 • • 發佈:2019-02-10
最近在學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解碼取得字串,得到的還是亂碼啊!怎麼會取得正確的字元呢!!!想不通啊!
之後,通過查詢資料,得到了一點想法,程式碼如下:
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=newString(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 }
先前沒有想通主要是自己沒注意到:
- 沒有著重的想為什麼會在輸出時出現字元亂碼?
- 客戶端傳送求時,字元轉換成位元組序列時的編碼方式是什麼樣的?
總的來說,亂碼是由於編碼方式與解碼方式不一致導致的,這一句話沒有理解透!如果當時這樣想既然出現了亂碼,肯定是那邊的編碼格式和解碼格式不一致,就好了!
注:編碼:將字串轉換成位元組序列;解碼:將位元組序列轉換成字串