jsp页面传递中文参数乱码的解决

form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
  1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
  
    对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc

(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。

 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。

这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。

   2。服务器端(tomcat)是如何将数据获取到进行解码的。

   第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。

通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接

Java代码 
new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式") 
new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")

还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置

本人的解决方法:在js中将参数进行编码


 <script language="javascript" type="text/javascript">
 
     function goToPage(cusCode,currentYear,currentMonth,cusName){
      
      var url= "checkCityInvUpload.do?method=checkCityInvUploadDetail&cusCode=" + cusCode;
   	var location  = encodeURI(url);//js中的编码方法
   	window.open(location);
     }

</script>

	var location  = encodeURI(url);//js中的编码方法
   	window.open(location);
     }

</script>

后台的接收方法:
java.net.URLEncoder.encode(keywords)
java.net.URLEncoder.encode(keywords)

1.JSP与页面参数之间的乱码

  JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。

解决这类乱码问题的基本方法是在页面获取参数之前,强制指定

request获取参数的编码方式:request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。
 

 servlet  如果在JSP将变量输出到页面时出现了乱码,

可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。


2、数据库乱码
  这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:
 

 在数据库连接字符串中加入编码字符集
  String Url="jdbc:mysql://localhost/digitgulf?user=root&password=root&useUnicode=true&characterEncoding=GB2312";
  并在页面中使用如下代码:
  response.setContentType("text/html;charset=gb2312");
  request.setCharacterEncoding("gb2312");
 

3.中文作为参数传递乱码
  当我们把一段中文字符作为参数传递个另一页面时,也会出现乱码情况,解决方法如下:
  

在参数传递时对参数编码,比如
  RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
  然后在接收参数页面使用如下语句接收
  keywords=new String(request.getParameter("keywords").getBytes("8859_1"));
 

4.JSP中文乱码问题之四:Get方式表单传递和URI方式传递参数乱码,tomcat中加编码的配置

解决方案

apache-tomcat-6.0.18\conf\server.xml
在这个内加入一行
< Connector port="8080" protocol="HTTP/1.1"     connectionTimeout="20000"     redirectPort="8443"  URIEncoding="GBK" />

5.在b.jsp中把String name=request.getParameter("name");修改为  

          String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");

6.JSP中文乱码问题更好的解决方法是使用过滤器技术

Encoding过滤器

package com.htt;  

 import java.io.IOException; 

  import javax.servlet.Filter;  

 import javax.servlet.FilterChain;   import javax.servlet.FilterConfig;  

 import   javax.servlet.ServletException; 

  import javax.servlet.ServletRequest;  

 import javax.servlet.ServletResponse;  

 public class Encoding implements Filter {       

public void      destroy() {  }     

  public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {      

request.setCharacterEncoding("GBK");     

  chain.doFilter(request, response);     

  }      

 public void init(FilterConfig filterConfig) throws ServletException { } 

  }      

Web.xml文件中的设置

< filter>     

< filter-name>encoding< /filter-name>    

 < filter-class>com.htt.Encoding< /filter-class>

  < /filter>  

< filter-mapping>    

 < filter-name>encoding< /filter-name> 

   < url-pattern>/ToCh_zn< /url-pattern>  

< /filter-mapping> 


 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漏无语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值