zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HeadFirst设计模式之RMI介绍
    HeadFirst设计模式之状态模式
    算法Sedgewick第四版-第1章基础-001递归
    HeadFirst设计模式之组合模式
    HeadFirst设计模式之迭代器模式
    HeadFirst设计模式之模板方法模式
    HeadFirst设计模式之适配器模式
    CentOS-6.5-saltstack-安装
    Swift
    在OC中调用Swift类中定义delegate出现:Property 'delegate' not found on object of type ...
  • 原文地址:https://www.cnblogs.com/BruceKing/p/14312114.html
Copyright © 2011-2022 走看看