java Web 中文亂碼
參考: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 中文亂碼