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

 更新时间:2014年10月26日 10:15:38   投稿:hebedich  
这篇文章主要介绍了java中form以post、get方式提交数据中文乱码问题总结,需要的朋友可以参考下

  一: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")先编码。

相关文章

  • 排查Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl

    排查Failed to validate connection com.mysql.cj.jdbc.Connec

    这篇文章主要介绍了Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl问题排查,具有很好的参考价值,希望对大家有所帮助
    2023-02-02
  • Mybatis-Plus实现公共字段自动赋值的方法

    Mybatis-Plus实现公共字段自动赋值的方法

    这篇文章主要介绍了Mybatis-Plus实现公共字段自动赋值的方法,涉及到通用字段自动填充的最佳实践总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • JavaSE学习之内部类及常用API

    JavaSE学习之内部类及常用API

    这篇文章主要介绍了JavaSE中的内部类和几个常用的API,文中的示例代码介绍详细,对我们学习JavaSEI有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • Mybatis读取和存储json类型数据的实现

    Mybatis读取和存储json类型数据的实现

    本文主要介绍了Mybatis读取和存储json类型数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • struts升级到2.5.2遇到的问题及解决方案(推荐)

    struts升级到2.5.2遇到的问题及解决方案(推荐)

    原来的版本是2.3.x,由于安全原因需要升级到2.5.2。但是在升级过程中遇到各种各样的问题,下面小编给大家带来了struts升级到2.5.2遇到的问题及解决方案,需要的朋友参考下吧
    2016-11-11
  • 一文详解如何在SpringMVC的视图中渲染模型数据

    一文详解如何在SpringMVC的视图中渲染模型数据

    SpringMVC是一个基于Spring框架的Web框架,它提供了一种方便的方式来处理 HTTP 请求和响应,在SpringMVC中,视图是用来渲染模型数据的组件,它们负责将模型数据转换为HTML、JSON、XML等格式的响应,在本文中,我们将讨论如何在SpringMVC中的视图中渲染模型数据
    2023-07-07
  • java 基本算法之归并排序实例代码

    java 基本算法之归并排序实例代码

    这篇文章主要介绍了java 基本算法之归并排序实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java简单模拟实现一个线程池

    Java简单模拟实现一个线程池

    本文主要介绍了Java简单模拟实现一个线程池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Java输出Hello World完美过程解析

    Java输出Hello World完美过程解析

    当我们学习一门编程语言的时候,我们都会先学如何输出Hello World!本文通过几个例子给大家介绍输出Hello World的代码,感兴趣的朋友一起看看吧
    2021-06-06
  • Spring Boot应用事件监听示例详解

    Spring Boot应用事件监听示例详解

    这篇文章主要给大家介绍了关于Spring Boot应用事件监听的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论