精华内容
下载资源
问答
  • Form表单提交数据乱码问题

    千次阅读 2017-11-18 20:29:24
    面对多种编码方式,一旦处理不好或者稍有不慎,乱码问题就层出不穷,乱码...下面,主要说一下如何解决Form表单提交数据出现的乱码问题 Form表单以Post方式提交数据 浏览器将数据(假设为“中国”)发送给服务器的时候

    面对多种编码方式,一旦处理不好或者稍有不慎,乱码问题就层出不穷,乱码问题是个巨坑啊~~~
    具体有哪些编码方式,自行百度或者见我写的某一篇博文,里面提到过之所以出现乱码是因为用了不同的码表去解码编码,好比对于同一把锁拿不同的钥匙去打开是万万不可行的。
    下面,主要说一下如何解决Form表单提交数据出现的乱码问题

    Form表单以Post方式提交数据

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

    //告诉服务器是以何种方式解码
    //浏览器使用何种方式进行编码传递数据,那么就应该指示服务器以何种方式解析数据,从而获得原来的数据
    request.setCharacterEncoding("UTF-8");
    
    //响应客户端的请求时,告知服务器应该使用何种方式进行编码
    response.setCharacterEncoding("UTF-8");
    //告诉客户端应该以何种方式进行解码,即解析服务器发来的数据,保证解码编码方式相同,才能保证获得原来的数据而不出现乱码
    response.setHeader("Content-type","text/html;charset=utf-8");
    //上述两条语句,可用如下一条语句代替:
    //response.setContentType("text/html;charset=utf-8");
    

    Form表单以Get方式发送数据

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

    request.setCharacterEncoding("UTF-8");//以get方式提交数据时,request设置编码无效。即使设置了UTF-8还是会去查ISO8859-1
    String userName = request.getParameter("userName");
    //先使用ISO8859-1编码,然后再利用UTF-8进行编码
    userName = new String(userName.getBytes("ISO-8859-1"),"UTF-8");

    总结:

    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文件
    1.这里写图片描述
    这种方式并不推荐,因为更改了服务器且并不灵活。
    2.这里写图片描述
    这么设置后,request的setCharacterEncoding设置什么编码,连接器就用什么编码,虽然比上一种更改灵活,但依然会导致我们的应用程序牢牢依赖于服务器,也不被推荐。

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

    展开全文
  • 但是之前一直出现一个乱码的问题,后台输出也是中文的,但是前台显示就是乱码。开始就考虑到应该是乱码问题,于是开始找资料。最终发现问题所在是jsp页面的编码方式缺少一个 %> 重要的事情多说一遍 ...
    今天做公司的项目,登陆名称有中文有英文,所以有另一个界面来自动显示所有企业,再将值传回登陆界面的username。但是之前一直出现一个乱码的问题,后台输出也是中文的,但是前台显示就是乱码。开始就考虑到应该是乱码问题,于是开始找资料。最终发现问题所在是jsp页面的编码方式缺少一个<% request.setCharacterEncoding("UTF-8");
    

    %>  重要的事情多说一遍                        

    <%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="UTF-8"%>

    <% request.setCharacterEncoding("UTF-8");%>

    这个编码一定要设置。中间还改form的method=“GET”,还真的出来值了。差一点就用get方式了。还好后来无意中加了那句话。

    最后希望大家编码的时候要多注意细节,来公司一个月了还是会出现细节问题,很羞愧

    展开全文
  • 主要介绍了java中form以post、get方式提交数据中文乱码问题总结,需要的朋友可以参考下
  • Spring MVC接收前台form表单提交数据乱码问题

    一、当form表单提交方式为“get”时

    修改Tomcat配置文件的conf/server.xml,在第65行的标签中加入

    URIEncoding="utf-8"

    二、当form表单提交方式为“post”时

    (1)需要配置jsp页面编码集为”utf-8”,即

    <%@page pageEncoding="utf-8" %>

    (2)需要配置spring提供的一个过滤器(CharacterEncodingFilter)。

    <filter>
        <filter-name>encodingFilter</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> 
    </filter>
    
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    展开全文
  • 以后,当我们再次用表单什么的提交数据就可以直接和乱码什么说拜拜了,也不用再和做编码处理了处理 可以直接如下使用: String name = request.getParameter("username"); String like = request....

    我们先定义一个过滤器叫做EncodeFilter,访问资源时,先走过滤器。解决问题的前提:我们知道处理get方式提交表单要再编码再解码,处理post方式也可以这样。

    哎,还是贴代码吧,语言太苍白了

    package com.zgf.filter;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.security.Principal;
    import java.util.Enumeration;
    import java.util.Locale;
    import java.util.Map;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.ServletInputStream;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpSession;
    
    public class EncodeFilter implements Filter {
    
    	public void init(FilterConfig filterConfig) throws ServletException {
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		//处理post方式的乱码
    		//request.setCharacterEncoding("utf-8");
    		
    		HttpServletRequest req = (HttpServletRequest)request;
    		MyRequest myReq = new MyRequest(req);
    		
    		chain.doFilter(myReq, response);
    	}
    
    	public void destroy() {
    	}
    
    }
    class MyRequest extends  HttpServletRequestWrapper
    {
    	ServletRequest r;
    	private HttpServletRequest req;
         MyRequest(HttpServletRequest req)
    	{
        	 super(req);	
        	 this.req = req;
    	}
    
    
    	@Override
        public String getParameter(String name) {
            Map<String,String[]> map = getParameterMap();
            if(map.containsKey(name))
                return map.get(name)[0];
            else
                return null; //map.get(name)[0]==null?"null":map.get(name)[0]       
        }
    
    	@Override
    	public String[] getParameterValues(String name) {
    		Map<String,String[]> map = getParameterMap();
    		return map.get(name);
    	}
        boolean flag = true;
    	@Override
    	public Map<String,String[]> getParameterMap() {
    		Map<String,String[]> map = req.getParameterMap();
    		if(flag){
    			for(Map.Entry<String, String[]> en:map.entrySet()){
    				 String[] arr = en.getValue();
    				 for(int i=0;i<arr.length;i++){
    					 //数组中的每个值都要再编码再解码处理
    					 try {
    						arr[i] = new String(arr[i].getBytes("ISO8859-1"),"utf-8");
    					} catch (UnsupportedEncodingException e) {
    						e.printStackTrace();
    					}
    				 }
    			}
    			flag = false;
    		}
    		return map;
    	}
     
         
    }
    
    

    本文仅限于getParameter(),getParameterValues(),getParameterMap().大笑

    以后,当我们再次用表单什么的提交数据就可以直接和乱码什么说拜拜了,也不用再和做编码处理了处理

    可以直接如下使用:

    		String name = request.getParameter("username");
    		String like = request.getParameterValues("like")[0]

    深度优化--把resposonse响应客户端也过滤了

    package com.zgf.filter;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    /**
     * 通用解决 get 和 post乱码过滤器
     * 
     */
    public class EncodeFilter implements Filter {
    
    	@Override
    	public void destroy() {
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		// 处理请求乱码
    		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    		HttpServletRequest myRequest = new MyRequest(httpServletRequest);
    
    		// 处理响应乱码
    		response.setContentType("text/html;charset=utf-8");
    
    		chain.doFilter(myRequest, response);
    	}
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    	}
    
    }
    
    // 自定义request对象
    class MyRequest extends HttpServletRequestWrapper {
    
    	private HttpServletRequest request;
    
    	private boolean hasEncode;
    
    	public MyRequest(HttpServletRequest request) {
    		super(request);// super必须写
    		this.request = request;
    	}
    
    	// 对需要增强方法 进行覆盖
    	@Override
    	public Map getParameterMap() {
    		// 先获得请求方式
    		String method = request.getMethod();
    		if (method.equalsIgnoreCase("post")) {
    			// post请求
    			try {
    				// 处理post乱码
    				request.setCharacterEncoding("utf-8");
    				return request.getParameterMap();
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    		} else if (method.equalsIgnoreCase("get")) {
    			// get请求
    			Map<String, String[]> parameterMap = request.getParameterMap();
    			if (!hasEncode) { // 确保get手动编码逻辑只运行一次
    				for (String parameterName : parameterMap.keySet()) {
    					String[] values = parameterMap.get(parameterName);
    					if (values != null) {
    						for (int i = 0; i < values.length; i++) {
    							try {
    								// 处理get乱码
    								values[i] = new String(values[i]
    										.getBytes("ISO-8859-1"), "utf-8");
    							} catch (UnsupportedEncodingException e) {
    								e.printStackTrace();
    							}
    						}
    					}
    				}
    				hasEncode = true;
    			}
    			return parameterMap;
    		}
    
    		return super.getParameterMap();
    	}
    
    	@Override
    	public String getParameter(String name) {
    		Map<String, String[]> parameterMap = getParameterMap();
    		String[] values = parameterMap.get(name);
    		if (values == null) {
    			return null;
    		}
    		return values[0]; // 取回参数的第一个值
    	}
    
    	@Override
    	public String[] getParameterValues(String name) {
    		Map<String, String[]> parameterMap = getParameterMap();
    		String[] values = parameterMap.get(name);
    		return values;
    	}
    
    }
    


    友情提示:

    1、doGet方法的调用还是要有的

    doGet(request,response);
    2、一般可能会忽略的情况--web.xml文件配置信息

      <filter>
      		<filter-name>EncodeFilter</filter-name>
      		<filter-class>com.zgf.filter.EncodeFilter</filter-class>
      </filter>
      
      <filter-mapping>
      		<filter-name>EncodeFilter</filter-name>
      		<url-pattern>/*</url-pattern>
      </filter-mapping>


    展开全文
  • form表单提交中文数据出现乱码问题 form表单中添加以下属性 <form action="" method="" enctype="multipart/form-data" accept-charset="UTF-8"></form>
  • form表单提交中文乱码

    2014-08-24 21:24:48
    今天写页面,提交一个form表单,中文是乱码,去网上找了一些方法。 一,设置页面编码 &lt;%@page language="java" pageEncoding="GBK" contentType="text/html; charset=GBK" ...
  • 前端Form表单提交中文乱码问题

    千次阅读 2018-10-30 09:45:14
    form表单提交中文乱码问题 1.前端将参数通过encodeURI编码 encodeURI(JSON.stringify(submitData)) 2.后台接收时使用URLDecoder.decode解码 URLDecoder.decode(jsonStr, “utf-8”); ...
  • 在用jquery处理html5的应用的时候,一直在firefox下测试都正常,用户用pad访问的时候说有乱码,自己试验了下果然,后发现chrome和ie内核下都是有此问题,此问题设置了页面属性为utf-8时候,只有firefox是传的charset...
  • form有2中方法把数据提交给服务器,get和post,分别说下吧。 (一)get提交 1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 对于get方法来说,都是把数据串联在请求的url...
  • 可是就是这个原因让我碰到了提交表单时出现中文乱码的事情。   解决办法:经测试OK!!! 没有采用form插件(采用form插件解决办法一样直接对data进行二次转码),而是直接使用jquery的$.ajax()函数进行异步请...
  • form表单提交中文乱码问题

    千次阅读 2017-10-17 15:08:20
    今天在做一个小项目时,遇到了form表单提交到数据库中的中文乱码情况。经过打断点排查原因,发现是 在执行存数据库操作之前就已经乱码了。经过一番检查,发现了问题所在,特此记录下。form在前端以post方式提交设置 ...
  • 用普通的form表单提交数据,到后台接收数据时发现乱码,经测试,找到了解决方法: accept-charset="UTF-8"> 在form标签中加入accept-charset="UTF-8"解决。
  • form表单提交中文乱码问题: 首先 get,和 post 的区别: 1> get 请求的请求参数附在地址栏的url之后,post请求是通过http post 机制将表单各个字段及其内容放在Html header 里面发送到所请求的action中 2>get ...
  • textarea标签提交数据乱码问题

    千次阅读 2018-10-12 17:17:35
    今天在用form表单提交的时候中间使用了&lt;textarea&gt; 标签,数据传输到后台发现乱码; 前台输入:“测试” 。 后台得到: “???è??”。 可以看到&lt;textarea&gt; 标签内数据默认是iso-8859-1...
  • 的页面使用form表单提交数据会出现乱码的问题,都将数据转为了UTF-8了. 解决方法: &lt;form action="xxx.xx" data-ajax="false"&gt; 禁用表单的ajax提交   原文:...
  • 今天在练习一个SSM的CRUD项目时,发现前端页面通过表单提交过来的数据保存到数据库后是乱码的! 于是,开始查找问题原因! 经过测试查找,发现数据库是可以保存中文的,不会发生乱码,不是问题所在; 同时,前端...
  • Form提交乱码问题 ,   前言 一直以为,只有 Request.QueryString 接收url查询字符串含中文时可能会乱码(做好编解码工作,很容易可以避免),碰到的时候,才知道 Request.Form 接收表单的值中含中文也会...
  • 今天做练习的时候用form表单获取数据,传到服务器然后通过jsp回传到客户端。 中间出现了乱码的问题 在jsp中写的中文是正常显示的,只有获取到的数据乱码的,那就说明乱码问题是从客户端发送到服务器端的问题...
  • post提交乱码原因:浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个码表提交数据。数据到达服务器后,数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,265
精华内容 10,506
关键字:

form提交数据乱码