关于乱码问题的两个Tomcat配置(Connector Common Attributes 属性源

说起乱码问题,其实一直都是老生常谈的问题,之所以会产生乱码是因为目标字符被非该字符的字符集进行解析,因字节数或不一样,该字符被“理解”成该字符集的xxx字符,因此造成乱码问题;

如果一个美国程序员提乱码,他们估计经验很少,因为英文26个字母组成的逻辑,几乎所有的字符集都支持,如ISO-8859-1,而乱码大多数都是其他字符,对于咱们中国程序员来讲就是中文字符;

对于中文字符,主要是双字节,而英文字符是单字节,字节数是不同的,因此使用ISO-8859-1去转码中文字符,必是乱码;

因此,解法就是,使用同样的字符集去解析字符,例如中文使用GB2312,GBK,UTF-8都行;


我们在本文中先看看Tomcat的两个配置,然后在下一篇文章中详细分解一下web服务器相关的整体编解码流程;


10.URIEncoding

URIEncoding

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.

该属性是非常有用的,如下图所示:


通常我们一般是中国人,在写代码的时候经常会在请求的url上加上一些中文汉字,例如上面的君山;

而毕竟Tomcat人家毕竟是老外的产品,默认只针对于英文字符能解析,也就是ISO-8859-1这个ISO标准字符集;

所以,我们在url中传递中文参数的时候,需要服务器端对url的解析才对;

这个URIEncoding属性对应的就是上图中的URI部分;

从源码上来看,在CoyoteAdapter中解析request的时候,有对应的convertURI方法对decodeedURI进行解析:


转义出来的URI就是GBK的部分;


11. useBodyEncodingForURI

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.

Notes: 

1) This setting is applied only to the query string of a request. Unlike URIEncoding it does not affect the path portion of a request URI.

 2) If request character encoding is not known (is not provided by a browser and is not set by SetCharacterEncodingFilter or a similar filter using Request.setCharacterEncoding method), the default encoding is always "ISO-8859-1". The URIEncoding setting has no effect on this default.


如果说URIEncoding属性对应的是URI,useBodyEncodingForURI 对应的就是后面的Query String;


Parameters是Tomcat基于参数的一个抽象,当encoding属性设置上了,在解析参数的时候会对参数部分进行解析;

当然,我们如果没有配置这个属性,也不是说在Servlet就不能处理,可以在Servlet执行这段代码:


需要对String字符串进行转码,getBytes的第一个参数一定需要与这个配置相对应,如果没有配置的话,那么就是ISO-8859-1,

第二个参数就是需要转的码,如果是中文,那么只能选择GBK,GB2312,utf-8这些;


本文描述了两个配置,URIEncoding是对请求字符串的URI部分进行转码,useBodyEncodingForURI  是对请求字符串的参数部分进行转码;


下一篇文章,我们会重点分析这两个配置属性在Tomcat这种web服务器的一些乱码生成原因中的用途,并结合一些商用服务器的乱码开放配置,进行讨论,从而总结一下乱码的实质,敬请期待!

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院