• javaweb中文中乱码分析与解决


    要想解决乱码的问题, 最好的办法是先弄清楚javaweb中数据传送的原理。 

    本文件将简单的讲解客户端的请求和服务器响应中编码的转换过程, 以及如何解决乱码的

    问题。

    request(req):  servlet中的请求头对象。

    response:(response) servlet中的响应头对象。

    1,使用response对象的字节流写数据时乱码的解决  

     现在有一个HttpServlet他的doGet()方法有如下代码

    1 String data = "数据";
    2 
    3 //resp是web容器传送过来的HttpServletResponse对象
    4 resp.getOutputStream().write(data.getBytes());

    使用getBytes获得字符串的字节数组, 我们没有在getBytes()中给出编码格式。

    也没有设置响应头中Content-type头的值, 浏览器不知道以什么编码来显示数据, 所以

    采用了默认的编码格式, 这样就产生了乱码。 

    这种类型的乱码比较容易解决, 在取得字符串的字节数组时给出相应的编码如UTF-8, 如果要在客户端正常显示就需要设置

    相应的响应头告诉客户端浏览器以什么编码来显示。 

    String data = "数据";
    resp.setHeader("Content-type", "text/html;charset=UTF-8");
    resp.getOutputStream().write(data.getBytes("UTF-8"));
                 

    2, 在使用response对象的字符流写数据时乱码的解决

    HttpServletResponse 有一个getPrintWrite()方法来获得一个字符流。 

    在向字符流写数据时情况和写字节流时是不同的。

    可以直接在write方法中给出字符串, 而不像字节流一样要把数据转换成字节数组

    String data = "数据";
                    
    //获得字符流
    PrintWriter pw = resp.getWriter();            
    pw.write(data);

    在数据传输中是不能传送字符数据的, 所以字符流也一样要把数据进行编码才成在网络上进行传输,这个编码过程被

    HttpServletResponse封装了, 默认的编码格式是使用ISO-8859-1, 浏览器接收到数据后得到如下图的结果, ISO-8859-1是不支持中文的

    所以在编码时以?号替代不能编码的字符。 

    解决方法:

    可以使用resp对象的getCharacterEncoding()方法得到当前的编码格式。

    String data = "数据";
                    
    //获得字符流
    PrintWriter pw = resp.getWriter();
    //得到当前resp的编码格式
    pw.write(resp.getCharacterEncoding());
    //pw.write(data);

    现在我们使用resp对象的setCharacterEncoding("UTF-8")方法来设置编码格式为UTF-8, 

    并且设置将HTTP响应头中的Context-type设置text/html;charset=UTF-8, 注意在设置

    resp对象的编码格式时, 要在取得字符流之前设置才有效。

    String data = "数据";
    resp.setCharacterEncoding("UTF-8");
    //获得字符流
    PrintWriter pw = resp.getWriter();
    //设置resp对象的编码格式
                    
    //告诉浏览器以什么格式编码。
    resp.setHeader("content-type", "text/html;charset=UTF-8");
                 
    pw.write(data);

    3,使用post方法传送表单数据时乱码

     先要理解数据传送的过程, 在一个post请求提交时,浏览器会将表单中的数据以ISO-8859-1进行编码后

    传送给服务器,当服务器收到数据后将HTTP请求头与数据保存在一个HttpSerlvetRequest中, 也就是一个request,

    request中的默认编码格式为ISO-8859-1, 所以在使用request.getParameter(String name)方法取得数据时, 实际上

    数据是以ISO-8859-1进行编码后的结果, 上面已经说了ISO-8859-1不支持中文,相应的也就产生了乱码。

    解决方法:

      数据是以ISO-8859-1编码的, 在使用request.getParameter(String name)得到数据后, 可以将得到的数据以ISO-8859-1编码的格式

    再进行编码得到数据的原始字节数组, 得到原始的字节数组后, 再以支持中文的格式进行编码。

    //得到以ISO-8859-1编码后的数据
    String data = req.getParameter("user");
    
    //使用getBytes方法再次用ISO-8859-1进行编码, 得到原始的字节数组.
    byte[] bytes = data.getBytes("ISO-8859-1");
    
    //使用原始字节数组new一个字符串并使用一个支持中文的编码
    data = new String(bytes, "UTF-8");
    
    System.err.println(data);

    如上图我们就得到了正确的数据, System.err.printf()输出不是红色这个不清楚。

    还有一种方法就是在form标签中设置accept-charset属性,然后在servlet中设置request.setCharacterEncoding(String name);

    中设置与accept-charset相同的值, 再取得数据同样能得到正确的数据。

       <form action="./charset"  method="post" accept-charset="UTF-8" >
             <input type="text" name="user" />
             <input type="submit" />
         </form>
    //设置请求对象的编码
    req.setCharacterEncoding("UTF-8");
    //得到以请求对象以UTF-8编码后的数据
    String data = req.getParameter("user"); System.err.println(data);
  • 相关阅读:
    一种预测城市未来发展和趋势的方法(关联分析和灰色系统预测)
    适宜性分析评价
    《现代城市规划》读书笔记之一
    外国建筑史的学习资料
    《城市建筑美学》读书笔记
    规划方案的评价(生态环境景观方面)
    地形分析与城市规划
    《建筑与城市规划导论》读书笔记之城市规划部分
    ajax与webGIS[转载]
    景观生态学概述[转载]
  • 原文地址:https://www.cnblogs.com/xwgblog/p/3438524.html
Copyright © 2020-2023  润新知