zoukankan      html  css  js  c++  java
  • Servlet解决乱码

    request.setCharacterEncoding("UTF-8");
    String username=request.getParameter("username");
    response.setCharacterEncoding("gb2312");
    response.setContentType("text/htm;charset=gb2312");
    response.getWriter().write(username);

    后台向前台传输中文乱码:

    只需要把 Tomcat 和浏览器的编码都改成 utf-8 

    在Servlet中 response.setCharacterEncoding("utf-8");这个方法只能改变 Tomcat 的编码方式,所以不行

    可以使用另一种方法:响应乱码解决方法:

    response.setContentType("text/html;charset=utf-8");

    浏览器向后台传输中文乱码问题:

    因为 GET 和 POST 两种提交方式不同 , 传输数据的方式也不同。

    POST: 大家都知道 post 请求,在请求路径后面的 ?和键值是没有的, 是因为post传输是另外专门开启了一个数据传输通道,其实是一个字节传输流 , 在Servlet 中 通过request.getInputStream(); 就可以获得这个字节流, 这条流也是依赖于Tomcat的所以它的编码也是 iso-8859-1 (这点我是猜的), 所以当这条字节流接收到 '中' 时,它会根据它自己的编码方式来获取 '中' 的编码 , 这时由于流本身的编码是不支持中文的,所以还是会把 '中' 当成 '?'来获取编码 还是 63 , 然后把 63 通过流传输到 java代码中 , 但是 java代码 看到的就是 63, 已经不是 '中' 的正确编码,所以出现乱码

    POST 乱码解决方法:

    request.setCharacterEncoding("utf-8");

    只需要把这条传输流的编码改成utf-8 , 这句可以把Tomcat和字节流的编码都改成 utf-8

    这时,字节流在获取浏览器传来的数据时就 不会出错,传输到后台字节也不会错,后台解析也就不会错了

    GET:大家都知道 get 方式是把传输的数据以 键=值 的方式加在请求路径的后面 (www.baidu.com?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu)

    get 方式本身传输还是通过 浏览器 --->  Tomcat  ---> java代码  这样的过程,也就是后台向前台传输的逆过程, 但是,由于浏览器的编码我们改不了,所有从浏览器到 Tomcat 这个过程字符已经出错 , 但是由于这个过程传输的是字节, 所以字节没有错,我们可以通过字节把字符逆转回来.

    String username = request.getParameter("username");

    username = new String(username.getBytes("iso-8859-1"),"utf-8");

  • 相关阅读:
    【译文】四十二种谬误(一)
    .NET笔记(二)
    设计模式C#实现(十六)——中介者模式
    设计模式C#实现(十五)——命令模式
    《程序员修炼之道》笔记
    《学会提问》读书笔记
    设计模式C#实现(十四)——责任链模式
    设计模式C#实现(十三)——享元模式(蝇量模式)
    学以致用——读《学会提问》
    访问苹果开发者网站太慢
  • 原文地址:https://www.cnblogs.com/zdcsmart/p/11910341.html
Copyright © 2011-2022 走看看