javaweb中文中乱码分析与解决
要想解决乱码的问题, 最好的办法是先弄清楚javaweb中数据传送的原理。
本文件将简单的讲解客户端的请求和服务器响应中编码的转换过程, 以及如何解决乱码的
问题。
request(req): servlet中的请求头对象。
response:(response) servlet中的响应头对象。
1,使用response对象的字节流写数据时乱码的解决
现在有一个HttpServlet他的doGet()方法有如下代码
String data = "数据"; //resp是web容器传送过来的HttpServletResponse对象
resp.getOutputStream().write(data.getBytes());
使用getBytes获得字符串的字节数组, 我们没有在getBytes()中给出编码格式。
也没有设置响应头中Content-type头的值, 浏览器不知道以什么编码来显示数据, 所以
采用了默认的编码格式, 这样就产生了乱码。

这种类型的乱码比较容易解决, 在取得字符串的字节数组时给出相应的编码如UTF-8, 如果要在客户端正常显示就需要设置
相应的响应头告诉客户端浏览器以什么编码来显示。
String data = "数据";
resp.setHeader("Content-type", "text/html;charset=UTF-8");
resp.getOutputStream().write(data.getBytes("UTF-8"));
2, 在使用response对象的字符流写数据时乱码的解决
HttpServletResponse 有一个getPrintWrite()方法来获得一个字符流。
在向字符流写数据时情况和写字节流时是不同的。
可以直接在write方法中给出字符串, 而不像字节流一样要把数据转换成字节数组
String data = "数据"; //获得字符流
PrintWriter pw = resp.getWriter();
pw.write(data);
在数据传输中是不能传送字符数据的, 所以字符流也一样要把数据进行编码才成在网络上进行传输,这个编码过程被
HttpServletResponse封装了, 默认的编码格式是使用ISO-8859-1, 浏览器接收到数据后得到如下图的结果, ISO-8859-1是不支持中文的
所以在编码时以?号替代不能编码的字符。

解决方法:
可以使用resp对象的getCharacterEncoding()方法得到当前的编码格式。
String data = "数据"; //获得字符流
PrintWriter pw = resp.getWriter();
//得到当前resp的编码格式
pw.write(resp.getCharacterEncoding());
//pw.write(data);

现在我们使用resp对象的setCharacterEncoding("UTF-8")方法来设置编码格式为UTF-8,
并且设置将HTTP响应头中的Context-type设置text/html;charset=UTF-8, 注意在设置
resp对象的编码格式时, 要在取得字符流之前设置才有效。
String data = "数据";
resp.setCharacterEncoding("UTF-8");
//获得字符流
PrintWriter pw = resp.getWriter();
//设置resp对象的编码格式 //告诉浏览器以什么格式编码。
resp.setHeader("content-type", "text/html;charset=UTF-8"); pw.write(data);

3,使用post方法传送表单数据时乱码
先要理解数据传送的过程, 在一个post请求提交时,浏览器会将表单中的数据以ISO-8859-1进行编码后
传送给服务器,当服务器收到数据后将HTTP请求头与数据保存在一个HttpSerlvetRequest中, 也就是一个request,
request中的默认编码格式为ISO-8859-1, 所以在使用request.getParameter(String name)方法取得数据时, 实际上
数据是以ISO-8859-1进行编码后的结果, 上面已经说了ISO-8859-1不支持中文,相应的也就产生了乱码。
解决方法:
数据是以ISO-8859-1编码的, 在使用request.getParameter(String name)得到数据后, 可以将得到的数据以ISO-8859-1编码的格式
再进行编码得到数据的原始字节数组, 得到原始的字节数组后, 再以支持中文的格式进行编码。
//得到以ISO-8859-1编码后的数据
String data = req.getParameter("user"); //使用getBytes方法再次用ISO-8859-1进行编码, 得到原始的字节数组.
byte[] bytes = data.getBytes("ISO-8859-1"); //使用原始字节数组new一个字符串并使用一个支持中文的编码
data = new String(bytes, "UTF-8"); System.err.println(data);

如上图我们就得到了正确的数据, System.err.printf()输出不是红色这个不清楚。
还有一种方法就是在form标签中设置accept-charset属性,然后在servlet中设置request.setCharacterEncoding(String name);
中设置与accept-charset相同的值, 再取得数据同样能得到正确的数据。
<form action="./charset" method="post" accept-charset="UTF-8" >
<input type="text" name="user" />
<input type="submit" />
</form>
//设置请求对象的编码
req.setCharacterEncoding("UTF-8");
//得到以请求对象以UTF-8编码后的数据
String data = req.getParameter("user"); System.err.println(data);
javaweb中文中乱码分析与解决的更多相关文章
- javaweb中的乱码问题(初次接触时写)
javaweb中的乱码问题 在初次接触javaweb中就遇到了乱码问题,下面是我遇到这些问题的解决办法 1. 页面乱码(jsp) 1. 在页面最前方加上 <%@ page language=&q ...
- javaweb中的乱码问题
0.为什么需要编码,解码, 无论是图片,文档,声音,在网络IO,磁盘io中都是以字节流的方式存在及传递的,但是我们拿到字节流怎么解析呢?这句话就涉及了编码,解码两个过程,从字符数据转化为字节数据就是编 ...
- 【转载】关于quartus ii软件中注释乱码问题的解决方法
最近在看Verilog代码,由于我的quartus版本打开他们的文件注释会全部乱码,痛苦万分!从网上找了下原因,解决方法基本没有,不过看到有人提出是编码的问题,立马我就想到一个解决方法,经过实验果然有 ...
- 关于quartus ii软件中注释乱码问题的解决方法
乱码现象: 解决办法: 打开文件所在工程找到该verilog文件(后缀名是.v),使用记事本打开,这时你会看到注释好好的没乱码,很高兴是不,不用着急.接下来点击文件再另存为,选择编码:UTF-8,点保 ...
- javaweb 中的乱码问题
一.post 方式 首先我们看下面一段代码,在该HTML中我们指定的编码为“UTF-8”,如图所示. 在该代码中,我们将表单数据提交给ParamServlet 处理 servlet 会将接收到的数据打 ...
- Java Web乱码分析及解决方式(一)——GET请求乱码
引言: 在进行Web開始时.乱码是我们最常常遇到也是最主要的问题.有经验的程序员非常easy能解决,刚開始学习的人则easy被泥潭困住. 并且非常多时候.我们即使攻克了乱码问题也是不明就里.往 ...
- centos 7 网站前端中文乱码分析、解决办法
2019-03-28 1.网站前端中文文字乱码主要原因有两点: (1)mysql数据库内部存储的数据本身处于乱码状态 (2)前端与数据库传输数据的字符集与数据库内部字符集不一致导致 2.查找造成中文乱 ...
- ssm框架中的乱码问题的解决
在搭建ssm框架过程中可能会出现乱码的问题,解决的最好方法就是不管在哪儿都设置为utf-8: 统一编码格式,所有的都设置为utf-8: 首先的就是将所有的请求设置为utf-8: 设置post请求的编码 ...
- Java Web乱码分析及解决方式(二)——POST请求乱码
引言 GET请求的本质表现是将请求參数放在URL地址栏中.form表单的Method为GET的情况.參数会被浏览器默认编码,所以乱码处理方案是一样的. 对于POST请求乱码.解决起来要比GET简单.我 ...
随机推荐
- 【朝花夕拾】Handler篇(二)
前言 一年前写过一篇文章[朝花夕拾]Handler篇,随着这一年来对Handler更多的认识和理解,本文对Handler知识点做的一些补充. 一.为什么要引入Handler Handler的主要作用是 ...
- postman 接口参数化操作
最近一直忙于AI模型的准确率任务中,这种操作需要大量的数据才能计算出模型的准确率.所以这里问遇到的问题和之前数据随机参数化有点不同,之前的参数比如说用户姓名或用户身份证号,这样数据可以在postman ...
- Delphi - Indy TIdMessage和TIdSMTP实现邮件的发送
idMessage / idSMTP 首先对idMessage类的各种属性进行赋值(邮件的基本信息,如收件人.邮件主题.邮件正文等),其次通过idSMTP连接邮箱服务器,最后通过idSMTP的Send ...
- java设计模式3.建造者模式、原型模式
建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...
- 牛客 136G-指纹锁 set容器重载
136G-指纹锁 题意: 设计一个容器,支持插入x,若与容器中的值最小相差为k,则自动忽略.删除操作,把与x相差为k的值都从容器中删除.查询操作,问容器中有没有和x相差为k的数值. 思路: 一个stl ...
- 牛客 136J-洋灰三角 +高中数学博大精深
参考学习:http://www.cnblogs.com/l609929321/p/9500814.html 牛客 136J-洋灰三角 题意: 在一个1 * n的棋盘中,第一格放1,之后的每一个放前一个 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 牛客小白月赛5 E 面积 计算三角形面积模板 波尔约-格维也纳定理 匹克公式
链接:https://www.nowcoder.com/acm/contest/135/E来源:牛客网 题目描述 定义“最大生成图”:在M*N的点阵中,连接一些点形成一条经过所有点恰好一次的回路,且连 ...
- 牛客练习赛51 A abc
A. abc 题意: 给出一个字符串s,你需要做的是统计s中子串”abc”的个数.子串的定义就是存在任意下标a<b<c,那么”s[a]s[b]s[c]”就构成s的一个子串.如”abc”的子 ...
- 题解 bzoj 2151 种树
题意 传送门 手写堆大法好啊,题解貌似没有结构体堆的做法,思路有些像配对堆,关于配对堆请自行百度,因为本蒟蒻不会.. 以下是蒟蒻的做法:建立一个大根堆a维护最大价值里面存入它的编号以及价值.听说配对堆 ...