Java项目访问中文资源的解决方法

来源:互联网 发布:json 解析工具 代码 编辑:程序博客网 时间:2024/06/06 02:14

在项目中遇到这样的问题,客户的资源文件(比如XML)中有中文名,
而访问的时候,带中文名的URL报404.
比如:http://localhost:8080/ProjectTest/cms/版权.xml

在IE地址栏直接输入也不行。

解决方法:
1. 要让带中文名的文件在IE地址栏可以直接访问,跟代码是没关系的,要改Tomcat设置。
Tomcat\conf\server.xml:在8080端口最后添加URIEncoding="UTF-8"即可

<Connector port="8080" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443" URIEncoding="UTF-8" />

2. 光是改了Tomcat,程序中还是访问不了,需要用URLEncoder.encode(string, "UTF-8")转码
        DocumentBuilder db = dbf.newDocumentBuilder();          Document doc = db.parse("http://localhost:8080" + encodeUrlToUTF8(request.getParameter("xml")));  

public static String encodeUrlToUTF8(String url) throws UnsupportedEncodingException{          StringBuffer sb = new StringBuffer();          for (int i = 0; i < url.length(); i++) {              String s = url.substring(i, i + 1);              byte[] bytes = s.getBytes("UTF-8");             // 中文字符是2个字节,符号和英文为1个字节              if (bytes.length == 1) {                if (bytes[0] == ' ')                      sb.append("%20");                  else                      sb.append(s);              } else {                  sb.append(URLEncoder.encode(s, "UTF-8"));            }          }          return sb.toString();      }  

补充一下我对编码设置的理解:

Tomcat中的URLEncoding的默认值ISO-8859-1(单字节编码),不能显示中文。它是用来设置URL解码时的字符编码。
如果资源里面有中文,则需要改成UTF-8或者GBK等类型。
Tomcat服务器既然设置了UTF-8的编码格式,则传给他的URL也必须是UTF-8格式,不然读不到。

一开始我以为web.xml中,有了下面的过滤器以后,会自动转换为UTF-8
    <filter>        <filter-name>encodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>        <init-param>            <param-name>forceEncoding</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
事实证明,在IE地址栏里面输入http://localhost:8080/ProjectTest/cms/版权.xml,确实会自动转换为UTF-8。
提交给服务器的URL如下:
http://localhost:8080/ProjectTest/cms/%E7%89%88%E6%9D%83.xml
说明web.xml的过滤器起了作用。

但是从代码里面直接读取资源的时候
            DocumentBuilder db = dbf.newDocumentBuilder();              Document doc = db.parse("http://localhost:8080" + encodeUrlToUTF8(request.getParameter("xml")));  

如果没有encodeUrlToUTF8手动转换为UTF-8的话,它直接会去读取服务器上http://localhost:8080/ProjectTest/cms/版权.xml这个文件,
Tomcat服务器以UTF-8来读取当然就读不到了。
所以web.xml中的设置对于代码读取文件似乎并不起作用,因此才需要手动在代码中转换。

0 0
原创粉丝点击