java乱码分析

    每次重新做个项目总是碰到过中文乱码问题,虽然每次都是改下tomcat配置,做个过滤器,在再请求前对中文参数进行encodeURI编码处理,最后问题解决了。但是一直没弄懂这之间的原理,这次花时间整理了下,只是个人理解,不知道是不是对的。

如果是post请求,且参数在post的data区中自动将参数进行URI编码。
如果是get请求,中文乱码参数必须手动进行encodeURI编码。

上面解释了post/get请求时对中文的解决方法,下面再说下服务端怎么处理request的请求编码。

首先若果配置了拦截器或者过滤器,在其中设置了request.setCharacterEncoding("utf-8");
request.setCharacterEncoding指的是post提交过来的data区请求数据按utf-8的编码解析。

(重点:拦截器或者过滤器对表单只是对表单的post请求的data数据区的数据有效)
 
如果是get请求或post请求中的URL的参数,则需要在tomcat中的servlet.xml中配置或者在每次获取参数时手动解码值java.net.URLDecoder.decode(value,"UTF-8");


在Tomcat中要设置URL的编码,可以修改server.xml文件中,相应的端口的Connector的属性:URIEncoding="UTF-8",这样,GET方式提交的数据才会被正确解码。

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


有时候你在tomcat中配置了utf-8,在java中通过URLDecoder.decode(request().getParameter(name),"UTF-8")取值就相当于进行了二次解码,这个时候在前端进行二次加密刚encodeURIComponent(encodeURIComponent(value)),其实没必要,只要注意不与tomcat的配置冲突就行,在get请求的时候对URL进行一次编码即可。


js编码函数

js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent

附带escape,decodeURI,decodeURIComponent之间的区别

escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z


你可能感兴趣的:(java乱码分析)