乱码问题


针对Post方式提交的请求如果出现乱码,可以每次在request解析数据时设置编码格式:request.setCharacterEncoding("utf-8");

也可以使用编码过滤器来解决,最常用的方法是使用spring提供的编码过滤器:在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器)

                  <!-- 解决easyUI提交表单乱码问题20160818 -->
  <filter>  
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

针对Get方式的乱码问题, 

post请求和get请求存放参数位置是不同的:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用。

此时可以在每次发生请求之前对URL进行编码:例如:Location.href="/encodeURI"("http://localhost/test/s?name=中文&sex=女");

当然也有更简便的方法,那就是在服务器端配置URL编码格式:

修改tomcat的配置文件server.xml:
             <Connector URIEncoding="UTF-8" port="8080"   maxHttpHeaderSize="8192"maxThreads="150" minSpareThreads="25" maxSpareThreads="75"connectionTimeout="20000" disableUploadTimeout="true" />

只需增加 URIEncoding="UTF-8"  这一句,然后重启tomcat即可。 

对于表单提交数据默认是使用get方式,一般指定method="post"  这时乱码的解决就可以在web.xml中配置即可。

 
post方式
params['city']=bmCity         ---前台js
new String(value.trim().getBytes("ISO-8859-1"),"UTF-8")   ---后台controller
 
 
url方式:
encodeURI(bmCity,"UTF-8");        ---前台js 编码
new String(bmCity.trim().getBytes("ISO-8859-1"),"UTF-8")   ---后台controller 解码
 
encodeURI(encodeURI(Url+"&type=3&gs_code="+id_gs_code+"&segment_id="+id_segment_id+"&tmall_code="+id_tmall_code+"&msg="+msg)),  
String msgStr= java.net.URLDecoder.decode(request.getParameter("msg"),"UTF-8");      
 
两个页面之间中文传参数乱码:
'&lockers_name='+encodeURI(selectRow.lockers_name)+
var id_lockers_name=decodeURI($$.QueryString("lockers_name"));
 
//导出excel
String as = "导出快递柜基本信息表_"+DateUtils.getDate(new Date());
String fileName = new String(as.getBytes("GB2312"), "ISO_8859_1");
 

经验:1:如果中文返回出现??字符,这表明没有加response.setCharacterEncoding("UTF-8");这句话。      

       2:如果返回的中文是“烇湫”这种乱码,说明浏览器的解析问题,应该检查下是否忘加response.setHeader("Content-type", "text/html;charset=UTF-8");这句话。

//这句话的意思,是让浏览器用utf8来解析返回的数据  
response.setHeader("Content-type", "text/html;charset=UTF-8");  
//这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859  
response.setCharacterEncoding("UTF-8");  

request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。
response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。

 

 


 
 
 
 
 
posted @ 2017-08-11 15:24  ____小菜鸟  阅读(204)  评论(0编辑  收藏  举报