問題來源:
作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>
測試結果:javascript
因而在網上搜索 「<img/>路徑帶中文 亂碼」的相關處理,暫時(20151025) 我只找到下面這一種處理方式(修改 「
??\apache-tomcat-7.0.47-windows-x86\conf\server.xml」的配置):
一、原來的 <Connector/>的內容爲:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
二、添加 URIEncoding 的設置後,變成:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
三、重啓 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