表单传递中文参数时request.getParameter出现乱码(post,get请求编码问题)

参数乱码

我在表单传递一个sex="男”的参数时,报错

com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'sex' at row 1

说我数据库给的字段不够。我数据库设置的sex类型为char(1),按道理应该恰好可以。我猜测出现了乱码
在这里插入图片描述

于是我输出了参数值,结果出现乱码了

 String sex = request.getParameter("sex");

改成以下就好了

String sex = request.getParameter("sex");
sex = new String(sex.getBytes("ISO8859-1"),"UTF-8");

但是从tomcat8.0开始,URIEncoding默认值不再是ISO8859-1,而变成了UTF-8 。而且之前我获取中文参数也没出现过问题。就很奇怪。

发现问题

花了两个小时,找到了问题所在。归根结底还是在初学的时候没搞懂Post和Get请求。

官方文档

URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL.
 If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.

从tomcat8.0开始,URIEncoding默认值不再是ISO8859-1,而变成了UTF-8 。那么也就意味着,从tomcat8.0开始,get请求中的中文参数,不需要特殊处理了
于是肯定就是我自己的问题。又看了几遍自己的代码。
发现自己用的post请求,写代码写蒙了,竟然用的post。(post一般用于文件上传,登陆验证)

Http请求协议包
在这里插入图片描述
而post请求请求参数信息是保存在请求体中的。
问题解决了。改成get请求不用转就ok了

那用post请求怎么解决参数乱码问题呢?

在在form所在的html文件里如果有段 ,那么post就会用此处指定的编码方式编码。 一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是 指定form表单的post方法提交数据的 URL encode编码方式 。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。

如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是 request.setCharacterEncoding(“字符集”) 可以派上用场。

我再表单的html中设置的 <meta charset="UTF-8">,在获取参数的servlet中加上了request.setCharacterEncoding(“utf-8”);就不会乱码了。

参考:
Servlet get中文乱码
参数传递的编码问题

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值