1. 程式人生 > >java Web 中文亂碼

java Web 中文亂碼

res utf 同時 訪問 文件的 redirect article nco 16px

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