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
Servlet中文乱码原因 解决 Get 和 Post 和客户端的更多相关文章
- Servlet 中文乱码问题解析及详细解决方法
		使用 servlet 向客户端浏览器回送中文时,经常出现中文乱码的问题,这里给大家完完全全地搞明白: 一.基本常识 中文系统默认是 GBK 编码(GBK是对GB2312的补充,包含它) 需要处理编码问 ... 
- JSP的学习(4)——中文乱码的解决
		本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决. 中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP.Servlet或Tomcat上随处可见.比如我们在写一个Servlet时 ... 
- jsp中文乱码终极解决方法(转)
		一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ... 
- 详解get请求和post请求参数中文乱码的解决办法
		首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ... 
- MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法
		一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ... 
- xShell终端中文乱码完全解决方法
		xShell终端中文乱码完全解决方法 xShell(xShell5)以及其他终端中文乱码的原因无非有三种:(1)Linux系统的编码问题:(2)xShell终端的编码问题: (3)两端的语言编码不一致 ... 
- Ubuntu中wine程序安装windows软件中文乱码如何解决
		1.安装wine sudo apt install wine 2.安装中文程序方法 下载exe文件 在命令行执行 wine 文件名.exe 3.中文乱码原因分析 查看/home/用户名/.wine/d ... 
- windows下SVN日志反馈中文乱码的解决方法
		转自:https://shiyousan.com/post/635889908703806636 TortoiseSVN中文乱码的问题困扰了我好久,特别是每次使用“以标准差异文件显示修改”时,打开的文 ... 
- Win 7英文系统显示中文乱码的解决(转)
		Win 7英文系统显示中文乱码的解决http://www.enet.com.cn/article/2011/0811/A20110811896633.shtml 请点击Startmenu并点击Cont ... 
随机推荐
- 从零开始学习SVG
			1 什么是SVG? MDN中的定义是:SVG即可缩放矢量图形(Scalable Vector Graphics,SVG),是一种用来描述二维矢量图形的 XML 标记语言. 简单地说,SVG 面向图形, ... 
- 移除HTML5 input在type="search"时的清除按钮
			input[type="search"]::-webkit-search-cancel-button { display: none; } 
- 页面定制CSS代码初探(三):设置正文最小高度
			前言 没想到再次写这篇,已经过去1年半了. 现在审美也发生了改变,一开始做的样式全删了,只保留了h2的样式.原先认为界面要宽,两边留太多空很浪费,看惯了知乎和简书,觉得默认最大1000px的排版也不错 ... 
- X位的有/无符号整数
			目录 X位的有符号整数 X位的无符号整数 知识点来自leetcode整数翻转 X位的有符号整数 以4位为例,不管多少位都是相同的概念 在有符号整数中,第一位二进制位用来表示符号,0为正,1为负 最大值 ... 
- 全文检索lucene6.1的检索方式
			背景: 工作任务完成后,闲暇之计给自己充充电! Lucene是一个纯java全文检索工具包,采用倒排索引原理. 全文检索:指的是计算机索引程序通过扫描文章的每一个词,对每一个词建立一个索引,并指明该词 ... 
- 初见UDP_Client
			from socket import *ip_prot = ('192.168.55.1',8080)buffer_size = 1024udp_client = socket(AF_INET,SOC ... 
- C# 基础复习 四 ADO
			调用存储过程,并接收多个表的查询结果 一个表用一个DataTable,DataSet可以存储多个DataTable DataSet需要SqlDataAdapter来填充数据 SqlConnection ... 
- Python-基础-day4
			深浅copy 1.先看赋值运算 h1 = [1,2,3,['aihuidi','hhhh']] h2 = h1 h1[0] = 111 print(h1) print(h2) #结果: # [111, ... 
- [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)
			题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ... 
- JavaScript中的基础测试题
			Java ... 
