URIEncoding和useBodyEncodingForURI详解

本文详细解析了使用Tomcat解决请求乱码的方法,包括URIEncoding和useBodyEncodingForURI参数的用法。同时讨论了不同浏览器对URL和查询参数的编码差异,并通过实验证明了如何根据浏览器特性调整编码以避免中文乱码问题。
之前关于编码的问题已经总结过两次了,有些地方写的很粗略。
http://blog.itpub.net/29254281/viewspace-775925/
http://blog.itpub.net/29254281/viewspace-1063133/

Tomcat解决请求乱码可以使用URIEncoding和useBodyEncodingForURI.下面是两个参数的具体说明,参见ApacheTomcat官方手册。
URIEncoding
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
useBodyEncodingForURI
This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
http://tomcat.apache.org/tomcat-7.0-doc/config/http.html


在上图可以看到,中文乱码容易出现在两个地方。一个是所请求的资源名称为中文,一个是查询参数的内容包括中文。
更复杂的是,不同的浏览器可能使用两种编码分别处理URL和查询参数。
useBodyEncodingForURI只是针对图上"author=君山"的查询参数(QueryString)有效,他的设置对于URL和URI无效。
下面以Windows环境为例,分别测试谷歌、火狐和IE浏览器请求中文资源和中文参数的乱码情况。

下表是三种浏览器的编码情况。其中IE的URI编码可以调整为UTF8。

默认URI编码默认查询参数编码
谷歌UTF8UTF8
火狐UTF8GBK
IEGBKGBK

1.Tomcat的URIEncoding设置为UTF8
谷歌正常
火狐可以请求到资源,但是查询参数的中文为乱码
IE不能请求到资源

测试代码如下

测试结果如下:


2.将IE的URI编码设置为UTF8,开启useBodyEncodingForURI,并设置request的字符集为GBK。

针对URI和查询参数使用两种编码的情况,可以使用useBodyEncodingForURI。他会根据http body设置的字符集解码。
将IE设置为"发送UTF8的URL"之后,三种浏览器都使用UTF8作为URI编码,但是IE和火狐的查询参数使用GBK编码,而谷歌的查询参数使用UTF8编码。所以在这种情况下,IE和火狐的访问都是正常的,而使用谷歌浏览器,可以访问资源,但是中文的查询参数则是乱码。

测试结果:


实验得出的结论是
1.URIEncoding和useBodyEncodingForURI都可以处理中文乱码的问题
2.浏览器对于URI和查询参数可能使用两种不同的编码方式,这种情况下,可以使用useBodyEncodingForURI调整查询参数的编码。

参考:
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
在Maven项目的`pom.xml`文件里,`<uriEncoding>`主要用于配置请求URI的字符编码,其作用、用法配置说明如下: ### 作用 `<uriEncoding>`的作用是指定针对HTTP请求中URI部分的字符编码,尤其是在处理GET请求时,能避免因字符编码不一致而导致的乱码问题。比如在处理包含中文或其他特殊字符的URL时,正确设置`<uriEncoding>`可保证服务器能准确解析这些字符。 ### 用法 `<uriEncoding>`通常在配置Maven的Tomcat插件时使用,一般在`<configuration>`标签内进行设置。以下是具体的配置示例: ```xml <build> <plugins> <!--Tomcat7插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!--指定义访问项目时的上下文根路径--> <path>/maven-demo02-web</path> <!--访问tomcat的端口--> <port>8080</port> <!--针对get方式请求字符集编码--> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build> ``` 上述代码出自引用[4],展示了在`tomcat7-maven-plugin`中配置`<uriEncoding>`的方式。 ### 配置说明 - **取值**:`<uriEncoding>`的值通常设置为`UTF-8`,因为UTF - 8是一种通用的字符编码,能支持世界上大多数语言的字符。 - **适用范围**:该配置主要适用于使用Maven的Tomcat插件(如`tomcat7-maven-plugin`)来启动嵌入式Tomcat服务器的场景。 - **位置**:`<uriEncoding>`必须放在插件的`<configuration>`标签内,这样才能确保在Tomcat服务器启动时生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值