Servlet中文乱码原因 解决 Get 和 Post 和客户端

一、Get方式的中文乱码

1) 使用如下页面表单内容:

<form action="http://127.0.0.1:8080/day07/params" method="get">
        用户名:<input name="username" type="text" /><br/>
        密 码:<input name="password" type="password" /><br/>
        <input type="submit" />
</form>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2) 获取表单内容代码:

图1 
 
3) 控制台打印乱码内容:

图2 
 
4) 乱码的根本原因是什么呢? 
(打开tomcat下doc工程/index.html文件——Configuration—-HTTP 搜索 URIEncoding)

图3 

解决乱码的核心代码:

解决乱码的核心思路,就是把得到的乱码按照原来乱码的步骤逆序操作。

1、先以iso-8895-1进行解码

2、然后再以utf-8进行编码

1) 第一种方式 使用URLEncoder 和 URLDecoder 两个类 编解码

如:

//获取客户端传递过来的用户名参数值
    String username = request.getParameter("username");
    System.out.println("用户名:" + username);

    // 先对用户名进行解码得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式
    username = URLEncoder.encode(username, "ISO-8859-1");

    // 再进行utf-8编码 一次得到页面上输入的文本内容
    username = URLDecoder.decode(username, "UTF-8");
    System.out.println("乱码解决后用户名:" + username);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2) 第二种方式 使用 String类的方法进行编解码

    username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
    System.out.println("乱码解决后用户名:" + username);
  • 1
  • 2
  • 3

解决乱码的代码如下:

public class Params2 extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    //获取客户端传递过来的用户名参数值
    String username = request.getParameter("username");
    System.out.println("用户名:" + username);

    // 先对用户名进行编码得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式
    //  username = URLEncoder.encode(username, "ISO-8859-1");

    //再进行utf-8解码 一次得到页面上输入的文本内容
    //  username = URLDecoder.decode(username, "UTF-8");

    //      System.out.println("乱码解决后用户名:" + username);

    // 先iso-8859-1编码,再utf-8解码
    username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

    System.out.println("乱码解决后用户名:" + username);

    // 获取密码
    String password = request.getParameter("password");
    System.out.println("密码:" + password);
}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

二、POST请求中文参数值乱码问题解决

post请求方式乱码的原因是:

因为post是以二进制流的形式发送到的服务器。服务器收到数据后。

默认以iso-8859-1进行编码。

POST请求乱码解决,只需要在获取请求参数之前调用

request.setCharacterEncoding(“UTF-8”); 方法设置字符集 即可。

如下: 
protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException {

    // 1.post请求方式的数据是以二进制流的形式发送到服务器。
    // 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。
    // setCharacterEncoding必须要获取请求参数之前调用才有效
    request.setCharacterEncoding("UTF-8");

    //获取客户端传递过来的用户名参数值
    String username = request.getParameter("username");
    System.out.println("用户名:" + username);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

三、输出中文到客户端的乱码解决方法

(1)、输出字符串内容到客户端

1) 往客户端输出。分两个步骤:

第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)

第二步:调用输出流对象,写出数据第客户端

如:

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // 通过response响应对象获取到字符输出流
    Writer writer = response.getWriter();
    // 往 客户 端 输出数据。
    writer.write("this is response content!");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

但是:输出中文到客户端的乱码解决方法

1) 如果拿到writer字符输出流。直接输出中文内容返回到客户端。会得到乱码。

比如:

程序如下,客户端收到会有乱码情况:

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // 通过response响应对象获取到字符输出流
    Writer writer = response.getWriter();
    // 往 客户 端 输出数据。
//      writer.write("this is response content!");
    // 输出中文数据到客户端
     writer.write("这是中文的输出");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过浏览器访问后显示的结果:

图4 
 
遇到这种情况是什么原因呢?

主要是因为服务器输出的字符串的编码和客户端显示字符串的编码不一致。导致乱码问题。

所以我们只需要设置服务器和客户端的编码相同就可以解决这个问题。

2) 乱码的解决。

设置服务器的字符串编码

    //设置服务器输出的编码为UTF-8
    response.setCharacterEncoding("UTF-8");
  • 1
  • 2
  • 3

设置客户端的字符串显示编码。

    //告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
    response.setContentType("text/html;charset=utf-8");
  • 1
  • 2
  • 3

这两行语句要在获取输出流之前执行。才会生效。

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    //设置服务器输出的编码为UTF-8
    response.setCharacterEncoding("UTF-8");

    //告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
    response.setContentType("text/html; charset=utf-8");

    // 通过response响应对象获取到字符输出流
    Writer writer = response.getWriter();
    // 往 客户 端 输出数据。
    // writer.write("this is response content!");

    // 输出中文数据到客户端
     writer.write("这是中文的输出");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

再次通过浏览器访问。得到的是正确的中文。 
图5: 

http://blog.csdn.net/lxf512666/article/details/52939573

原文地址:https://www.cnblogs.com/feng9exe/p/8398216.html

时间: 2024-08-06 09:06:08

Servlet中文乱码原因 解决 Get 和 Post 和客户端的相关文章

Servlet中文乱码的解决方法

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//以下两句,设置UTF-8编码,可以解决乱码 resp.setCharacterEncoding("UTF-8"); resp.setHeader("content-type","text/html;charset=UTF-8")

JSP/ Servlet常见的中文乱码原因

在开发中,我们经常遇到中文乱码的问题,比方: &浏览器中看到的 Jsp/Servlet 页面中的汉字成了 '?' ?  &浏览器中看到的 Servlet 页面中的汉字都成了乱码  &Jsp/Servlet 页面无法显示 GBK 汉字. &Jsp/Servlet 不能接收 form 提交的汉字. &JSP/Servlet 数据库读写无法获得正确的内容. 隐藏在这些问题后面的是各种错误的字符转换和处理.解决类似的字符encoding问题,须要了解 Jsp/Servlet

JSP的学习(4)——中文乱码的解决

本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决. 中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP.Servlet或Tomcat上随处可见.比如我们在写一个Servlet时,经常要使用响应对象Response来设置使用的编码表或者给浏览器输出的响应中的响应头设置某个编码表,如在之前博客<Servlet的学习之Response响应对象(1)> 中介绍的一样. 本篇主要以上一篇<JSP的学习(3)——语法知识二之page指令>中page指令的最后部分的两个属

[转]Servlet 中文乱码问题及解决方案剖析

一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码: 3.getBytes() 是通过平台默认字符集进行编码: 二.中文乱码出现 在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置:而在Servlet中,也会遇到中文乱码问题: 比如: OutputStream out = response.

详解get请求和post请求参数中文乱码的解决办法

首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解决办法 对于get请求解决中文乱码有两种途径一种是修改tomcat默认的编码方式为"UTF-8" 在tomcat的server.xml里把 <Connector connectionTimeout="50000" port="8080" pro

提交数据的中文乱码的解决方法

使用GET方式提交数据的中文乱码的解决方法: 使用URLEncoder.encode(name,"UTF-8")进行url编码:      String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(

SSH Secure Shell Client中文乱码的解决方法

这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要'UTF-8'编码,Windows中文版的编码是非UTF-8.zh_CN.UTF-8是UTF编码的中文语言环境.Windows使用的是GB2312编码,大多数linux系统支持的是UTF-8编码,而远程登陆时使用的是本地编码,所以会出现乱码的问题:现有几种解决方案: 方案一:修改linux服务器的环境变量 使用linux,在用户根目录下有一个.bash_profile配置文件,该配置只对当前用户有效.若对

Java中文乱码原因

Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪. 但是如果能理清其中的脉络,理解字符处 理的过程,对于解决问题很有指导意义,不至于解决了问题也不知道为什么. 其实,原因不外乎出在String输入时和输出时. 首先,Java中的任何String都是以UNICODE格式存在的. 很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以U

Sublime Text 3打开txt中文乱码的解决方法

Sublime Text是一个非常强大的编辑器,可是对中文的支持并不好,在Sublime Text 2 时,可以通过命令行的方式安装编码包来解决,但Sublime Text 3不能通过这样的方式解决 在安装完Sublime Text 3后要下载一个ConvertToUTF8包放到C:\Users\用户名\AppData\Roaming\Sublime Text 3\Packages(安装目录可能不是这个,但可以在sublime中preference - browse packages打开此目录)