博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet中文乱码原因 解决 Get 和 Post 和客户端
阅读量:6697 次
发布时间:2019-06-25

本文共 4144 字,大约阅读时间需要 13 分钟。

一、Get方式的中文乱码

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

用户名:
密 码:
  • 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

你可能感兴趣的文章
为什么要使用索引?
查看>>
pycharm 基础教程
查看>>
appium界面运行过程(结合日志截图分析)
查看>>
WCF REST 工作总结
查看>>
Java - 数组排序 -- 浅析稳定性与复杂度
查看>>
bzoj3689
查看>>
Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
查看>>
Codeforces Round #545 (Div. 1) 简要题解
查看>>
购物商城---页面缓存oscached
查看>>
java基础--理论2
查看>>
2017.12.14工程工艺问题
查看>>
2018.6.21 HOLTEK HT49R70A-1 Source Code analysis
查看>>
服务器设计笔记(4)-----客户端通信模块
查看>>
IntelliJ IDEA运行eclipse的web项目报错的问题
查看>>
PHP之省事儿的封装
查看>>
洛谷3812:【模板】线性基——题解
查看>>
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
查看>>
Python文件指针与Python函数
查看>>
ORM系列之Entity FrameWork详解
查看>>
[转] java Class类
查看>>