问题来源:
做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 2 3 4主页 5 6 7 8 主页 9 10 11 12
1 <%@ page language="java" import="java.util.*, fileTraversal.*, java.net.*" pageEncoding="utf-8"%> 2 <%request.setCharacterEncoding("utf-8");%> 3 4 5 6主页 7 8 9 10 主页 11 12 <%13 String str = "花.jpg";14 //String str = URLEncoder.encode("花.jpg", "utf-8");15 %>16 23 24 25
测试结果:
于是在网上搜索 “<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