<video/><img/>路径带中文,显示乱码(URIEncoding)
问题来源:
做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