問題來源:
做html5的video的時候,在設置播放文件的文件名為中文的時候,出現GET請求的文件名為亂碼(實際上,也不是亂碼,是對應的"utf-8"字符串的byte數組的16進制表示的字符串。∵我設置的jsp/html編碼都是"utf-8")
嘗試了一般的處理手段(如 “request.setCharacterEncoding("utf-8");”,“str = new String(str.getBytes("ISO-8859-1"),"utf-8");”,“
URLEncoder.encode”,“
URLEncoder.encode”),都不見效。
想到,類似<video>,<img/> 等的數據請求,是瀏覽器客戶端直接向tomcat發送的請求信息,然后tomcat也直接就將數據發給瀏覽器了,請求的信息 並不會經過 我們編寫的 jsp、servlet、filter等的處理,因此 上面的處理手段不會生效。
用<img/>測試了一下,測試代碼為:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2 <html> 3 <head> 4 <title>主頁</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6 </head> 7 <body> 8 主頁 <br> 9 <br/><br/> 10 <img src="花.jpg" alt="郁金香" /> 11 </body> 12 </html>
1 <%@ page language="java" import="java.util.*, fileTraversal.*, java.net.*" pageEncoding="utf-8"%> 2 <%request.setCharacterEncoding("utf-8");%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>主頁</title> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 8 </head> 9 <body> 10 主頁 <br> 11 <br/><br/> 12 <% 13 String str = "花.jpg"; 14 //String str = URLEncoder.encode("花.jpg", "utf-8"); 15 %> 16 <script type="text/javascript"> 17 window.onload = function() 18 { 19 // var img01 = document.getElementById("img01"); 20 // img01.src = encodeURI("<%=str%>"); 21 }; 22 </script> 23 <img id="img01" src="<%=str%>" alt="郁金香" /> 24 </body> 25 </html>
測試結果:
於是在網上搜索 “<img/>路徑帶中文 亂碼”的相關處理,暫時(20151025) 我只找到下面這一種處理方式(修改 “
??\apache-tomcat-7.0.47-windows-x86\conf\server.xml”的配置):
1、原來的 <Connector/>的內容為:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2、添加 URIEncoding 的設置后,變成:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
3、重啟 tomcat,測試 一切OK。
PS:注意:這樣修改之后 tomcat向 我們編寫的jsp、servlet、filter等 發送信息的時候,就是"UTF-8"編碼了,有些地方的“str = new String(str.getBytes("ISO-8859-1"),"utf-8");”就不再需要了(調用了反而出錯)(沒有指定URIEncoding的時候,tomcat默認接收/發送的都是"ISO-8859-1"編碼的信息)
ZC:自我感覺,瀏覽器<-->tomcat的流程是這樣的:
瀏覽器 --> 發請求 --> tomcat --> 我們編寫的jsp、servlet、filter等 --> tomcat --> 瀏覽器。
其中,傳送的數據 都是 byte數組的形式,又∵ tomcat的默認編碼為ISO-8859-1,∴即使 jsp/html編碼設置為utf-8,我們從tomcat得到的數據仍然是亂碼(utf-8字符串的byte數組的16進制表示的字符串),需要操作“str = new String(str.getBytes("ISO-8859-1"),"utf-8");”進行轉換。
實際上,我覺得 處理中文亂碼最簡單的方式是 jsp/html/servlet/tomcat 的編碼都設置成 utf-8,即可。(這樣設置之后,就不再需要處理亂碼的GET/POST方式,等等方式了) --> 這一條,待驗證,以后自己邊做邊驗證(20151025)。
C
