前端后端数据交换乱码问题

请求乱码

浏览器发送请求时使用的是什么编码呢?
浏览器打开表单页面时使用的什么编码就会用什么编码发送数据,我们可以通过设置打开表单页面的编码来控制页面发送数据时的编码。假设表单页面是utf-8,则这个页面发送请求参数用的也是utf-8。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

而服务器是用什么编码解析的呢?
以tomcat6为例,服务器默认用iso8859-1来解码,用utf-8编码,这就产生了乱码,因utf-8中是3个字节一个汉字,iso8859-1中是个字节一个字符,如“北京”为两个汉字,在utf-8中共六个字节,而iso8859-1按一个字节一个字符处理,显示出了6个问号。
我们该如何解决这个问题呢?
其实,只要对POST提交做如下设置即可:

 request.setCharacterEncoding("utf-8");

但是,这个方法只对请求的实体内容起作用,因GET提交的请求参数在地址栏后,并不在实体内容中,所以这个方法对于GET提交无效。


那么,该如何处理GET提交的乱码呢?

服务器用iso8859-1来解析,造成了乱码,由于iso8859-1无法正确显示这些字符,所以显示为了“?”,但是底层的编码仍然是正确的。所以,我们可以通过如下方式解决:
如果参数是country

 String country = new String(req.getParameter("country").getBytes("iso-8859-1"), "utf-8");

响应乱码
服务器发送数据到浏览器,有字符字节两种方式,这两种方式产生乱码的原理各不相同。

  1. 字节方式输出数据response.getOutputStream( ).write("中国".getBytes("utf-8"));
    乱码问题,大部分都是由于编码和解码码表不同产生的,服务器在发送中文数据时,使用的是UTF-8码表,那么浏览器是用什么码表解析的呢?IE浏览器在没有特别指定码表时,将使用所在操作系统的默认码表,utf-8的数据发送给浏览器后,浏览器用gbk2312打开自然就出现了乱码问题。
    那么如何解决这种乱码呢?
    在HTTP协议中提供了Content-Type响应头,我们可以通过这个头通知浏览器发送的数据是什么格式,如果是文本数据还可以通过charset属性通知浏览器用什么编码打开,因此我们只要做如下设置即可解决乱码:
response.setContentType("text/html;charset=utf-8");

  1. 字符方式输出数据response.getWriter().write(“中国”)
    服务器会在发送数据时将字符转换为字节后发送,那么服务 器使用的是什么编码集呢?以tomcat6为例,其默认编码集是iso8859-1,我们知道iso8859-1中是没有中文字符的,对于没有的字符 iso8859-1将会使用“?”来替代,所以浏览器页面上就显示成了“?” tomcat8以后默认为utf-8
response.setHeader("content-type", "text/html;charset=utf-8");

response.setCharacterEncoding("utf-8");

response.getWriter().write("中国");
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈行恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值