浏览器服务器中文乱码问题

中文乱码问题

一、请求乱码(服务器获取请求参数时乱码)

post方法请求:

1.原因:

服务器获取请求体内容时默认用iso编码方式进行解码。但是浏览器请求体中编码方式是html中指定的utf-8,所以就乱码了。

2.详细解释:

参数在html页面中请求,会按 照页面中的编码格式编码不指定请求体编码,默认按ISO8859-1编码。html中的<meta http-equiv="content-type" content="text/html; charset=UTF-8"> ,指定了浏览器对html的编码格式,post请求参数也会按页面的编码格式进行编码,请求参数在请求体中请求向服务器请求。

服务器获取post请求数据时(request.getParameter(“name”)),在不指定对请求体编码方式的情况下,不论浏览器传来的数据是什么编码,服务器都按iso8859-1对请求体解码,只要 请求体编码服务器对请求体的解码 方式不一样,就肯定会乱码。

3.解决服务器获取请求体中文乱码方式:
  • 1.在获取请求数据设置对请求数据的编码格式
    即告诉服务器应该用什么编码对请求参数进行解码
    request.setCharacterEncoding("utf-8"), 这句话就是告诉服务器应该按utf-8格式对参数解码。
    如果浏览器是按照gbk方式进行编码的,那么这么设置还是会乱码。
  • 2.在获取请求参数后,对每个参数进行重新编码
    String n2 = new String(获取到的参数.getBytes("iso8859-1"),"utf-8");
    代码解释:获取到的参数默认按照iso进行解码(获取到的参数已经被服务器按iso解码了),所以我们要先对他按iso编码,即 getBytes("iso8859-1") 得到初始的参数,然后在根据utf-8重新解码。如果浏览器是按照gbk方式编码,那就再根据gbk进行解码。即:new String(获取到的参数.getBytes("iso8859-1"),"gbk");

get方法请求:

1.原因:

请求数据在请求行数,编码方式也是按页面指定的编码utf-8,服务器对请求行中的参数只能用默认uri编码(iso或utf-8)进行解码,如果服务器默认uri编码是iso8859-1将会产生乱码。

2.详细解释:

请求数据在请求行中 按照页面编码格式编码(不指定页面编码默认是iso8859-1)
服务器获取get方式的请求行中的参数时,只能用默认编码方式(8之前iso,8之后utf-8)解码tomcat8之后默认URIEncoding是utf-8,tomcat8.5 如果页面是utf-8的话,get方式请求就不会乱码。

阶段性理解:tomcat中的URIEncoding应该是指请求行中的编码格式

3.解决get方式服务器获取请求参数中文乱码方式:

(tomcat8的服务器对请求体解码是utf-8,如果乱码了就表示浏览器中不是utf-8编码的)

  • 1.对获取到的参数重新编码 new String(参数.getBytes("解码格式 "),“编码格式”),与post一样
  • 2.修改服务器默认uri编码。server.xml中添加uriEncoding。
@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String name = req.getParameter("name");
		System.out.println(name);//正常
		
		String n1 = new String(name.getBytes("iso8859-1"),"utf-8");
		System.out.println(n1);// 乱码
		
		// 结论:按照utf-8编码解析url中的参数
	}

get不乱码的原因: https://blog.csdn.net/qq_32965187/article/details/87889052

获取tomcat的默认 uri编码:https://blog.csdn.net/love20yh/article/details/80863997

二、响应乱码(浏览器获取响应体时中文乱码)

1.原因:

服务器对响应体的编码格式,与,浏览器对服务器响应体的解码格式不一样。或使用的编码格式不支持中文。

2.详细解释:

服务器响应数据时(输出流write到响应体),在不指定编码方式的情况下,默认也是用ISO8859-1的方式,对响应内容进行编码
那么,首先iso是不支持中文的,肯定会产生乱码;
其次,即使服务器对响应体的编码方式支持中文,浏览器可能解码方式与其不匹配。
在浏览器控制台中的响应体里是通过服务器编码过的,在浏览器页面显示的是浏览器对响应体中的内容 解码 解析 过的

3.解决浏览器获取响应数据中文乱码:
  • 1.设置服务器对响应数据的编码格式,如utf-8,gbk。response.setCharacterEncoding("utf-8"):解释,将响应体内容按照指定编码格式进行编码。在浏览器控制台中的响应体中可以看到。
    但是,尽管响应数据支持中文了,浏览器的解码方式可能跟我们的编码方式不一样,浏览器同样会乱码。浏览器对响应体默认解码 是 gbk 或 utf-8,祖国的电脑一般都是gbk编码的,所以浏览器一般也都是gbk的。

  • 2.指定响应头中的contentType(推荐),内容类型。如:response.setContentType("text/html;charset=utf-8");
    设置服务器对响应体编码格式为utf-8,告诉浏览器用utf-8编码对响应体解码。
    这句话的作用:
    ①、设置了响应编码格式,即调用了response.setCharacterEncoding("utf-8");
    ②、把响应头的contentType字段改成了"text/html;charset=utf-8"
    contentType="text/html;charset=utf-8" :就相当于 html中的meta标签的内容类型
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    即,告诉浏览器用utf-8编码格式 解码当前页面(响应体)中的数据。
    普通html页面请求时,是将html源码响应到响应体中,然后浏览器进行解码解析,如果配置了charset,将会按指定编码格式进行解码。

三、URL编码

URL编码不同情况的解析: https://www.cnblogs.com/xiaojiulin/p/10598658.html

URL编码不同情况有不同的url编码方式。post和get的所有请求数据都会按照页面编码方式把中文转成url编码。其中 %XX 是一个字符,utf-8三个字符表示一个汉字,GBK两个字符表示一个汉字。
get和post请求,都会将查询字符串(参数)中非数字字母的字符按照网页编码格式进行URL编码

URL编码
例如:“传智”这两个字通过URL编码后得到的是:“%E4%BC%A0%E6%99%BA”。URL编码是先需要把“传智”转换成字节,例如我们现在使用UTF-8把“传智”转换成字符,得到的结果是:“[-28, -68, -96, -26, -103, -70]”,然后再把所有负数加上256,得到[228, 188, 160, 230, 153, 186],再把每个int值转换成16进制,得到[E4, BC, A0, E6, 99, BA],最后再每个16进制的整数前面加上“%”。
通过URL编码,把“传智”转换成了“%E4%BC%A0%E6%99%BA”,然后发送给服务器!服务器会自动识别出数据是使用URL编码过的,然后会自动把数据转换回来。

中文乱码问题,比较清楚明了: https://blog.csdn.net/xiaoyiaoyou/article/details/45147495

跟上边的一样:https://www.cnblogs.com/xdouby/p/8308915.html

POST和GET请求

一、POST和GET请求方式的区别:

  • Get:
    GET提交的数据会放在URL之后,也就是请求行里面,以?分隔URL和传输数据,参数之间以&相连
  • POST:
    当HTTP请求以POST方式发出时,请求参数位于请求体中。

区别
get方法参数在url中,浏览器对URL的长度有限制,所以get的请求数据大小有限,因为url暴露在外边,所以安全性不高

post方法请求参数在请求体中,所以请求数据大小没有限制,请求体不能直接看到,所以安全性相对高

注意:在默认情况下,浏览器发送的HTTP请求(GET和POST都是)采用“ISO-8859-1”字符编码;
但一般都会按页面编码方式编码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、tomcat对post和get采用不同的处理编码机制:

网上资料显示:自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,

对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码
(注意:Tomcat对请求体,响应体中的编码都是iso8859-1)

GET请求则不同,Tomcat对GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会使用Tomcat默认的UriEncding:iso-8859-1编码,但是在tomcat8之后URLEncoding默认是utf-8。即!对请求行中的数据按utf-8编码进行解码

======================================================

总结:

在不指定编码的情况下,服务器都是按照iso8859-1编码格式对请求体进行编码(服务器对请求行解码,tomcat8之后用utf-8,8之前也是iso8859-1),对响应体解码,浏览器解码是按照自己的编码(一般是utf-8和gbk),请求体的编码也是默认iso8859-1。

解决请求参数中文乱码:

  • 1.request.setCharacterEncoding("编码格式"); 一般是utf-8,或gbk
  • 2.获取到参数后,重新编码
    String n2 = new String(请求参数.getBytes("iso8859-1"),"编码格式");一般是utf-8,或gbk

解决响应数据中文乱码:

  • 1.response.setCharacterEncoding("编码格式");
  • 2.response.setContentType("text/html;charset=编码格式");(推荐)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值