当前位置: 移动技术网 > IT编程>开发语言>Java > java中form以post、get方式提交数据中文乱码问题总结

java中form以post、get方式提交数据中文乱码问题总结

2019年07月22日  | 移动技术网IT编程  | 我要评论

福盈氏,恋爱99天粤语,异世之横行天下

  一:form在前台以post方式提交数据:

    浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个码表提交数据。数据到达服务器后,数据(98 99)要封装到request中,在servlet中调用request的getparameter方法返回的是字符串(“中国”),方法内部拿到数字后要转成字符,一定要查码表,由于request的设计者是外国人,所以默认查的是他们常用的iso8859-1,这就是请求数据产生乱码的根源。

复制代码 代码如下:

package com.yyz.request;

import java.io.ioexception;
import java.io.printwriter;

import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
//以post方式提交表单
public class requestdemo extends httpservlet {

    public void doget(httpservletrequest request, httpservletresponse response)
            throws servletexception, ioexception {
         //请求数据的中文乱码问题
        request.setcharacterencoding("utf-8");//客户端网页我们控制为utf-8
        string username = request.getparameter("username");
        //获取数据正常,输出数据时可以查阅不同码表
        response.setcharacterencoding("gb2312");//通知服务器发送数据时查阅的码表
        response.setcontenttype("text/html;charset=gb2312");//通知浏览器以何种码表打开
        printwriter out = response.getwriter();
        out.write(username);

    public void dopost(httpservletrequest request, httpservletresponse response)
            throws servletexception, ioexception {
        doget(request,response);
}

二:form在前台以get方式提交数据:

   get方式提交的数据依然是浏览器用什么码表打开就用什么码表发送。不同的是,以get方式提交数据时,request设置编码无效。即使设置了utf-8还是会去查iso8859-1。得到(? ?),要解决这个问题,需要拿着(??)反向查iso8859-1,拿到(98 99)后,再去查正确码表。

复制代码 代码如下:

 package com.yyz.request;
 
 import java.io.ioexception;
 import java.io.printwriter;
 
 import javax.servlet.servletexception;
 import javax.servlet.http.httpservlet;
 import javax.servlet.http.httpservletrequest;
 import javax.servlet.http.httpservletresponse;
//以get方式提交表单
public class requestdemo extends httpservlet {

   public void doget(httpservletrequest request, httpservletresponse response)
           throws servletexception, ioexception {
        //请求数据的中文乱码问题
       request.setcharacterencoding("utf-8");//以get方式提交数据时,request设置编码无效。即使设置了utf-8还是会去查iso8859-1
       string username = request.getparameter("username");
      system.out.println(username);
       byte source [] = username.getbytes("iso8859-1");
       username = new string (source,"utf-8");
       system.out.println(username);
      

   public void dopost(httpservletrequest request, httpservletresponse response)
           throws servletexception, ioexception {
       doget(request,response);
}

}


三:提交数据中文乱码问题总结:

1.如果提交方式为post,想不乱码,只需要设置request对象的编码即可。

      注意:客户机数据是以哪种方式提交的,request就应该设成什么编码。

2.如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。

     string data = "???????";//乱码字符串
     byte source [] = data.getbytes("iso8859-1");//得到客户机提交的原始数据
     data = new string (data.getbytes("iso8859-1"),"utf-8");//解决乱码

     //等同于

    data = new string (source,"utf-8");

3.get方式的乱码,还可以通过更改服务器配置的方式实现。更改tomact的conf目录下的server.xml文件。

      3.1    
      
      
      
      这种方式并不推荐,因为更改了服务器且并不灵活。

      3.2
     
     
     
      这么设置后,request的setcharacterencoding设置什么编码,连接器就用什么编码,虽然比上一种更改灵活,但依然会导致我们的应用程序牢牢依赖于服务器,也不被推荐。

四:最后的最后,提一个小细节:url地址后面如果跟了中文数据,一定要经过url编码。表单提交的参数有中文数据,浏览器会自动帮我们编码,但如果是通过链接直接带中文参数,浏览器是不会帮我们编码的,这时想通过上述第二种方式解决中文乱码问题就时灵时不灵了,应该通过urlencoding.encode(,"utf-8")先编码。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网