欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

java-response-乱码解决

(1)响应体设置文本

PrintWriter getWriter()

获得字符流,通过字符流的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

posted @ 2021-02-04 16:29  萧静默  阅读(991)  评论(0编辑  收藏  举报