java Web 中文亂碼

來源:互聯網
上載者:User

標籤:問題本質   修改   iso   sdn   解析   bytes   過程   style   byte   

參考:http://www.cnblogs.com/haimishasha/p/6117968.html  (關於JAVA字元編碼:Unicode,ISO-8859-1,GBK,UTF-8編碼及相互轉換 - 海米傻傻 - 部落格園)

參考:http://www.cnblogs.com/haitao-fan/p/3399018.html(瀏覽器URL編碼 - 尼瑪範爺 - 部落格園)

參考:http://blog.csdn.net/dbb_zifeng/article/details/53304266(中文亂碼之填坑Java web - CSDN部落格)

今天下載一個中文檔案結果是404,檔案在路徑下存在,將檔案名稱改成英文就可以下載了,所以應該是中文編碼的問題。

環境:apache-tomcat-7.0.72 

在網上找了一下方法,這些方法是對應伺服器端亂碼的情況

方法1

<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>

方法2

String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3

request.setCharacterEncoding("gbk");

一次Http請求

瀏覽器【get/post】------------>解析URL-------------->擷取參數----------返回頁面-------------------->瀏覽器顯示

解碼過程

瀏覽器編碼------------->伺服器解碼--------------------->瀏覽器解碼

情況一:中文URL

URL:http://localhost:9080/DataDiscoveryWeb/resources/doc/建立文字文件.txt (這是一個直接存取檔案的URL)

問題:訪問不到

問題原因:瀏覽器對中文URL進行編碼---------------------->伺服器使用了不同於瀏覽器的編碼方式解碼

1.瀏覽器對URL編碼

各個瀏覽器對URL的編碼不同

解決方案:手動將此中文進行編碼:encodeURI(url),encodeURI編碼預設使用的是utf-8編碼方式

http://localhost:9080/DataDiscoveryWeb/resources/doc/建立文字文件.txt  ---------> http%3A%2F%2Flocalhost%3A9080%2FDataDiscoveryWeb%2Fresources%2Fdoc%2F%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt

2.Tomcat伺服器對URL解碼 

  當tomcat接收到該連結時,將會進行URL解碼,即去掉"%",同時按照ISO8859-1編碼識別。

  Tomcat 預設的解碼為ISO-8859-1,所以解析成  http://localhost:9080/DataDiscoveryWeb/resources/doc/??°??o???????????£.txt

解決方案:

  設定Tomcat的Server.xml檔案<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>

  設定URIEncoding="UTF-8"後,使用UTF解碼,結果是 http://localhost:9080/DataDiscoveryWeb/resources/doc/建立文字文件.txt

情況二:Get請求參數中有中文

URL:http://localhost:8080/myServlet?name=力量

問題:接受參數亂碼

問題原因:問題原因與情況一是一樣的,      瀏覽器對中文URL進行編碼---------------------->伺服器使用了不同於瀏覽器的編碼方式解碼(瀏覽器對請求參數的編碼和URL直接寫中文編碼可能不同)

瀏覽器編碼: 1.直接地址欄上寫http://localhost:8080/myServlet?name=力量        使用的是瀏覽器預設的編碼

       2.在頁面上寫http://localhost:8080/myServlet?name=力量,使用頁面的ContentType定義的Charset,(jsp頁面上的contentType="text/html;charset=gb2312")

我的JSP頁面代碼

<%@ page contentType="text/html;charset=gb2312" language="java" %><html><body><h2>力量</h2><a href="/myServlet?name=力量">跳轉</a><a href="/resources/doc/建立文字文件.txt">下載檔案</a></body></html>

點擊跳轉,地址欄上變成  http://localhost:8080/myServlet?name=%C1%A6%C1%BF(使用的是contentType中的charset的編碼方式)  

點擊下載檔案,地址欄變成      http://localhost:8080/resources/doc/建立文字文件.txt(最終使用瀏覽器的編碼方式   http://localhost:8080/resources/doc/%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt)

解決方案:

方法1:與情況一的解決方案一樣,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不過此時頁面的contentType中的charset也一定要設定為utf-8

方法2:在擷取參數的時候修改

String name = req.getParameter("name");
System.out.println(name);
String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");//此處與頁面的contentType中的charset一致
System.out.println(usernameString);

情況三:Post請求中參數帶中文

URL:http://localhost:8080/myServlet     請求參數 name:力量

問題: 伺服器中擷取參數String name = req.getParameter("name")  亂碼

原因:問題原因與情況一是一樣的,      瀏覽器對中文URL進行編碼---------------------->伺服器使用了不同於瀏覽器的編碼方式解碼

瀏覽器編碼的方式也是根據 contentType中的charse

解決方案:

方法1:與情況一的解決方案一樣,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不過此時頁面的contentType中的charset也一定要設定為utf-8

方法2:與情況二中的解決方案2樣,接收參數是轉碼  String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3:request.setCharacterEncoding("gbk");   一定要在request.getParameter("name")擷取參數之前設定編碼。

 

注意:HttpServletRequest.setCharacterEncoding()方法 僅僅只適用於設定post提交的request body的編碼而不是設定get方法提交的queryString的編碼。問題本質是get方式傳遞的參數內容預設編碼方式問ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也無法解決問題。

java Web 中文亂碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.