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

本文介绍了解决在Tomcat服务器中使用中文名URL时出现404错误的方法。通过配置Tomcat的server.xml文件启用UTF-8编码,并使用URLEncoder.encode进行URL转码,确保程序能正确解析和访问中文路径。

在项目中遇到这样的问题,客户的资源文件(比如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中的设置对于代码读取文件似乎并不起作用,因此才需要手动在代码中转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值