Form表单提交数据的乱码问题

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值