編碼問題


獲取表單數據的時候,有這句代碼request.setCharacterEncoding("UTF-8");,如果沒有這句代碼,會發生什么事呢?

  • 填寫數據

 

  • 在服務器查看提交過來的數據,所有的中文數據都亂碼了

 

 

  • 來這里我們來分析一下亂碼的原因,Tomcat服務器默認編碼是ISO 8859-1,而瀏覽器使用的是UTF-8編碼。瀏覽器的中文數據提交給服務器,**Tomcat以ISO 8859-1編碼對中文編碼,當我在Servlet讀取數據的時候,拿到的當然是亂碼。**而我設置request的編碼為UTF-8,亂碼就解決了。

  • 接下來使用get方式傳遞中文數據,把表單的方式改成get即可

  • 當我們訪問的時候,又出現亂碼了!

 

  • 於是我按照上面的方式,把request對象設置編碼為UTF-8試試

        request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); 
  • 結果還是亂碼。這是為什么呢?我明明已經把編碼設置成UTF-8了,按照post方式,亂碼問題已經解決了!。我們來看看get和post方式的區別在哪?為什么post方式設置了request編碼就可以解決亂碼問題,而get方式不能呢。

  • 首先我們來看一下post方法是怎么進行參數傳遞的。當我們點擊提交按鈕的時候,數據封裝進了Form Data中http請求中把實體主體帶過去了【傳輸的數據稱之為實體主體】,既然request對象封裝了http請求,所以request對象可以解析到發送過來的數據,於是只要把編碼設置成UTF-8就可以解決亂碼問題了

 

 

  • 而get方式不同,它的數據是從消息行帶過去的,沒有封裝到request對象里面,所以使用request設置編碼是無效的。

 

  • 要解決get方式亂碼問題也不難,我們既然知道Tomcat默認的編碼是ISO 8859-1,那么get方式由消息體帶過去給瀏覽器的時候肯定是用ISO 8859-1編碼了

        //此時得到的數據已經是被ISO 8859-1編碼后的字符串了,這個是亂碼 String name = request.getParameter("username"); //亂碼通過反向查ISO 8859-1得到原始的數據 byte[] bytes = name.getBytes("ISO8859-1"); //通過原始的數據,設置正確的碼表,構建字符串 String value = new String(bytes, "UTF-8"); 

上面的代碼有些難理解,圖說明一下:

 

  • 經過我們手工轉換,再來訪問一下

 

  • 好的,成功解決掉亂碼問題了。

  • 除了手工轉換,get方式還可以改Tomcat服務器的配置來解決亂碼,但是不推薦使用,這樣不靈活。

  • 我們都知道Tomcat默認的編碼是ISO 8859-1,如果在Tomcat服務器的配置下改成是UTF-8的編碼,那么就解決服務器在解析數據的時候造成亂碼問題了

  • 在8080端口的Connector上加入URIEncoding="utf-8",設置Tomcat的訪問該端口時的編碼為utf-8,從而解決亂碼,這種改法是固定使用UTF-8編碼的


    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/> 
  • 設置了編碼后,沒有做任何手工轉換,成功拿到數據

  • 當然也有另一種改服務器編碼的方式。設置Tomcat的訪問該端口時的編碼為頁面的編碼,這種改法是隨着頁面的編碼而變
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" /> 
  • 設置編碼為UTF-8

        request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); 
  • 再次訪問

  • 手寫超鏈接如果附帶中文參數問題,要URL重寫,在JSP博客中會講到

  • 總結:

  • post方式直接改request對象的編碼

  • get方式需要手工轉換編碼

  • get方式也可以修改Tomcat服務器的編碼,不推薦,因為會太依賴服務器了!

  • 提交數據能用post就用post


免責聲明!

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



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