java-response-乱码解决

摘要:
我们还可以在代码中指定浏览器分辨率页面的编码方法。响应的setContentType方法指定页面分辨率的编码为UTF-8response setContentType;上述代码不仅可以指定浏览器解析页面时的代码,还包括setCharacterEncoding的功能。因此,在实际开发中,只需编写响应即可。setContentType;您可以解决页面上中文乱码输出的问题。

(1)响应体设置文本

PrintWritergetWriter()

获得字符流,通过字符流的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方式提交原理如下图

java-response-乱码解决第1张java-response-乱码解决第2张

 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设置字符集直接指定

java-response-乱码解决第3张

 java-response-乱码解决第4张

 java-response-乱码解决第5张

 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

免责声明:文章转载自《java-response-乱码解决》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:fortios 5.4后门植入Android 的窗口管理系统 (View, Canvas, WindowManager)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kepware http接口 java语言开发

读取某变量的值(OK HTTP OkHttpClient client = newOkHttpClient(); Request request = newRequest.Builder() .url("http://127.0.0.1:39321/iotgateway/read?ids=Channel1.Device1.tag1,Channel1...

Guava LoadingCache不能缓存null值

测试的时候发现项目中的LoadingCache没有刷新,但是明明调用了refresh方法了。后来发现LoadingCache是不支持缓存null值的,如果load回调方法返回null,则在get的时候会抛出异常。 通过几个例子开看这个问题: public void test_loadNull() { LoadingCache<String,...

java servlet 几种页面跳转的方法及传值

java servlet 几种页面跳转的方法及传值 java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.application 6.通过隐藏域传值 7.通过JavaBean进行传值 8.request.setAttribute("strRequest",strRequest)...

spring + redis 实现数据的缓存

1、实现目标   通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)   2、所需jar包      注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons-pooljar的目录根据版本的变化,目录结构会变。前面的版本是org.apache.pool,而...

LaTex支持中文的三种方式(首推第一种)

转自:https://blog.csdn.net/z_feng12489/article/details/90449495 我们知道 Latex 一般用 CJK 和 CTEX 宏包支持中文编辑,CJK 和 CTEX 的默认编码是 GBK,而 windows 下的默然编码就是 GBK,因此 CJK 和 CTEX 不需要特殊配置就可以直接支持中文 Latex...

&amp;lt;转&amp;gt;PHP中正则表达式函数

PHP中的正则表达式函数       在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的,基于传统型NFA。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation Sy...