参数乱码
我在表单传递一个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”);就不会乱码了。