(1)响应体设置文本
获得字符流,通过字符流的write(
String s)
方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。
关于设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(
String charset)
设置response的编码
但我们发现客户端还是不能正常显示文字
原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系 统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以 手动修改浏览器的编码是UTF-8。
我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(
String type)
方法指定页面解析时的编码是UTF-8
response.setContentType("text/html;charset=UTF-8");
上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。
request.setCharacterEncoding("UTF-8");//将获取的内容以UTF-8显示----POST方式提交
request.setCharacterEncoding("UTF-8");//将获取的内容以UTF-8显示 POST方式提交 // 1、获得请求方式 String method = request.getMethod(); // 2、获得请求的资源相关内容 String URI = request.getRequestURI(); StringBuffer URL = request.getRequestURL(); String query = request.getQueryString(); String HEADER = request.getHeader("User-Agent");//取指定头名称 String username = request.getParameter("username");//指定请求体
//如果是get方式提交,需要先将提交内容进行"iso8859-1"编码,再使用"UTF-8"解码(大写)下图 当然一般现实中很少用get提交表单
username = new String(username.getBytes("iso8859-1"), "UTF-8");
String password = request.getParameter("password"); System.out.println(username + "...." + password); response.setContentType("text/html;charset=UTF-8");//将响应的内容以UTF-8发送 response.getWriter().write(username + "...." + password + "...." + method + "...." + URI + "...." + URL + ".." + query + ".." + HEADER);
GET方式提交原理如下图
tomcat默认全部都是用ISO-8859-1编码,不管你页面用什么显示,Tomcat最终还是会替你将所有字符转做ISO-8859-1.那么,当在另目标页面再用GBK翻译时就会将本来错的编码翻译成GBK的编码,这时的文字会乱码.
所以需要先将得到"字符"(不管是什么)都先用字节数组表示,且使用ISO-8859-1进行翻译,得到一个在ISO-8859-1编码环境下的字节数组.例如:AB表示成[64,65].然后再用GBK编码这个数组,并翻译成一个字符串.
那么我们可以得到一个编码转换的过程
假设:GBK码("你")->URLencode后变成->(%3F%2F)->Tomcat自动替你转一次ISO-8859-1->得到( 23 43 68 23 42 68 每一个符号表示为ISO-8859-1中的一个编码)->接收页面--->再转一次为ISO-8859-1的Byte数组[23,43,68,23,42,68]--->用GBK再转为可读的文字--->(%3F%2F"---->转为("你")
//也可以Tomcat里server.XML设置字符集直接指定
3.相关知识延伸阅读
3.1)在URL中中文字符通常出现在以下两个地方:
http://localhost:8080/example/中 国 name=中国
(1)Query String中的参数值,比如 keywords=中国
(2)servlet path,比如: /中 国
3.2)出现乱码问题的原因主要是以下几方面:
(1)浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范。
(2)Servlet服务器:Servlet服务器的没有正确配置。
3.3)相关知识:http请求的几个环节
浏览器(ie firefox)—————–>Servlet服务器 ——————–>浏览器显示
<编码> < 解码成unicode,然后将显示的内容编码> <解码>
(1)浏览器把URL(以及post提交的内容)经过编码后发送给服务器。
(2)这里的Servlet服务器实际上指的是由Servlet服务器提供的servlet实现ServletRequestWrapper,
不同应用服务器的 servlet实现不同,这些servlet的实现把这些内容解码转换为unicode,
处理完毕后,然后再把结果(即网页)编码返回给浏览器。
(3)浏览器按照指定的编码显示该网页。
注意:
当对字符串进行编码和解码的时候都涉及到字符集,通常使用的字符集为ISO8859-1、GBK、UTF-8、UNICODE。
3.4)相关知识:URL的组成及说明
域名:端口/contextPath/servletPath/pathInfo queryString
(1)contextPath是在Servlet服务器的配置文件中指定的
(a)对于weblogic:contextPath是在应用 的weblogic.xml中配置。
具体参考:https://blog.csdn.net/zhou_pp/article/details/83545602