一、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

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

  1. Servlet 中文乱码问题解析及详细解决方法

    使用 servlet 向客户端浏览器回送中文时,经常出现中文乱码的问题,这里给大家完完全全地搞明白: 一.基本常识 中文系统默认是 GBK 编码(GBK是对GB2312的补充,包含它) 需要处理编码问 ...

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

    本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决. 中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP.Servlet或Tomcat上随处可见.比如我们在写一个Servlet时 ...

  3. jsp中文乱码终极解决方法(转)

    一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ...

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

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  5. MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法

    一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ...

  6. xShell终端中文乱码完全解决方法

    xShell终端中文乱码完全解决方法 xShell(xShell5)以及其他终端中文乱码的原因无非有三种:(1)Linux系统的编码问题:(2)xShell终端的编码问题: (3)两端的语言编码不一致 ...

  7. Ubuntu中wine程序安装windows软件中文乱码如何解决

    1.安装wine sudo apt install wine 2.安装中文程序方法 下载exe文件 在命令行执行 wine 文件名.exe 3.中文乱码原因分析 查看/home/用户名/.wine/d ...

  8. windows下SVN日志反馈中文乱码的解决方法

    转自:https://shiyousan.com/post/635889908703806636 TortoiseSVN中文乱码的问题困扰了我好久,特别是每次使用“以标准差异文件显示修改”时,打开的文 ...

  9. Win 7英文系统显示中文乱码的解决(转)

    Win 7英文系统显示中文乱码的解决http://www.enet.com.cn/article/2011/0811/A20110811896633.shtml 请点击Startmenu并点击Cont ...

随机推荐

  1. animate.css引入实现动画效果

    最近在网上看到很多代码都通过引入animate.css来实现动画效果,后来我便使用这种方法来尝试着写了个小案例,结果真的很好用,比我们通常情况下使用css或js实现动画效果好得多,便在此做个总结. 第 ...

  2. OracleRef游标

    提到个思考:怎样让游标作为参数传递? 解决这个问题就需要用到 REF Cursor . 1,什么是 REF游标?  动态关联结果集的临时对象.即在运行的时候动态决定执行查询.   2,REF 游标有什 ...

  3. hdu 1532 Drainage Ditches 【ISAP 】

    还是不是很懂算法 先存一个模板先吧--- 看的这篇学的-- http://www.renfei.org/blog/isap.html #include<cstdio> #include&l ...

  4. PhotoZoom的工具栏 图片放大不失真

    使用PhotoZoom能够对数码图片无损放大,备受设计师和业内人员的青睐,它的出现时一场技术的革新,新颖的技术,简单的界面,优化的算法,使得它可以对图片进行放大而没有锯齿,不会失真.本文为您一起来认识 ...

  5. CorelDRAW升级计划--如何购买

    了解通过全新 CorelDRAW 2017升级计划更新此图形设计软件所有最新功能的实惠方案.助升级计划,您可以在下一主要产品版本推出时便收到该版本,从而始终使您的产品保持最新.升级计划取代为 X6 和 ...

  6. HDU1231 最长连续子序列

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  7. 设置Django关闭Debug后的静态文件路由

    Django在Debug模式关闭掉后请求静态文件时,返回404相应码,后台的请求url是"GET /static/css/404.css HTTP/1.1" 404 1217,找不 ...

  8. springcloud关键词解释和基础代码

    原文来自某位大神(不诉薄凉),感觉很好,分享出来. SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么 ...

  9. ivew Modal rule校验冲突问题

    问题描述:新建和编辑公用的是一个弹框,打开新建关闭之后,会影响到编辑的弹框.  解决方法:赋值前先重置一下表单  this.$refs["你的表单"].resetFields();

  10. 一些css兼容问题

    由于各浏览器的不同,会存在一些兼容问题,特别是兼容IE6/7/8 下面简单介绍了一些解决方法,更多问题可以访问 W3help.org来查看. 可以通过js获取浏览器版本 document.body.i ...