JavaWeb项目中出现中文乱码如何解决

引言

乱码问题在中国是尤为常见的一种情况,且难以避免。它出现的原因是中文和英文编码格式上的差异,编码不同,则解码也不同。由于我们编程中遇到的无论编辑器,语言,参考文档,源码等几乎都是由英文构成,在编码解码的过程中与中文往往会产生冲突,因此,也就产生了几乎每个学习编程的人都会遇到的问题:中文乱码。让若计算机的兴趣,发展,集成是在中国,并且由中国传向世界,那么,面临乱码问题的可能就是其他国家了…

  • 常见编码

1.UTF-8
2.ISO8859-1
3.GBK
4.GB2314

  • 乱码出现原因

浏览器与 jsp ,html ,servlet 等页面各自使用的码表不同,不同码表之间编码解码出现混搭,则引起了中文乱码


正文 :

HttpServletResponse中文乱码

分两种情况:
1.以字符流输出时候的乱码问题
2.以字节流输出时候的乱码问题

一、以字符流输出

语法 :response.getWriter()
举例 :以输出中文字符 " 中国 " 为例,浏览器会出现的情况
特点 :默认使用 ISO-8859-1 编码格式输出
. --------------------------------------------------------------------------------------------------------------------
public class ResponeDemo01 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = “中国”;
PrintWriter out = response.getWriter();
out.print(data);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
-------------------------------------------------------------------------------------------------------------------------
以下是浏览器会出现的画面 :
在这里插入图片描述

  • 错误解析

错误的部分 : 中文字符 " 中国 " 在浏览器中被 " ? ? " 替代。
错误原因 :respone在以字符流输出时候,默认采用的编码格式为 ISO-8859-1,该码表不兼容中文(当码表内查询不到响应的字符编码时候,就会以编码为 63 的字符替代,而该码表中编码为 63 的字符恰好为 " ? " ),因此,中文字符 " 中国 " 在浏览器中就呈现为了 " ? ? "

  • 图片分析

在这里插入图片描述

  • 解决方案1

方法1 :改变自身编码方式,迎合浏览器的编码方式(即浏览器是什么格式,就在代码内指定respone以什么编码输出到客户端)
response.setCharacterEncoding(“UTF-8”);

  • 使用方法1修改过后,浏览器显示的界面为

在这里插入图片描述

  • 字符仍然错误的原因解析

错误原因 :在 Servlet 中修改了输出时候的编码格式,但是浏览器不一定是 UTF-8 的编码格式,可以通过修改浏览器的编码格式,达到正确的显示效果。
缺点 :不能要求用户来实现修改浏览器编码来达到正确显示,不符合需求分析的逻辑

  • 图片分析(这里所使用的浏览器默认为 GB2312)

在这里插入图片描述

  • 解决方案2

方法2 :规定浏览器在读取这一份代码字符的时候,以什么样的解码格式去解读

  	response.setHeader("Content-Type", "text/html; charset=UTF-8");
  • 使用方法2修改过后,浏览器显示的界面为(最终正确显示)

在这里插入图片描述

二、以字节流输出

语法 :response.getOutputStream()
例子 :response.getOutputStream().write(“中国”.getBytes());
特点 :默认使用 UTF-8 的编码格式输出

  • 与以字符流输出区别

差异 :以字节流输出默认使用 UTF-8 编码格式,而以字符流则默认为 ISO-8859-1
相同 :在中文乱码问题上,会遇到与以字符流输出同样的问题,即 servlet 的编码格式与浏览器出现不一致的问题

  • 以字节流输出时候解决乱码问题方案

同以字符流输出解决方案一致,但通常采用组合版本,即
方法 1 与方法 2 组合的写法(精简版):

  	response.setContentType("text/html;charset=UTF-8");
  • 总结

方法 1 与方法 2 组合的写法(精简版):

  	response.setContentType("text/html;charset=UTF-8");

核心观点 :改变浏览器或者 servlet 其中一方的编码种类,使得两者保持一致


HttpServletReqeest中文乱码

分两种情况:
1.以 Get 方式请求遇到的乱码问题
2.以 Post 方式请求遇到的乱码问题

一、Get方式

以Get请求过来的数据,是非加密的,且在地址栏上显示的就是已编码过的,因此,读取过来的字符就产生了乱码。当 Tomcat 接收到这批数据后,getParameter 默认使用ISO-8859-1去解码,这里就产生了编码解码选择种类不一致的情况,所以产生乱码。以下是两种解决方案

  • 1.代码转码
  username = new String(username.getBytes("ISO-8859-1") , "UTF-8");

原理 :先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串

  • 2.修改 Tomcat 默认配置
  <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 	
  redirectPort="8443" URIEncoding="UTF-8"/>

原理 :在tomcat里面做设置处理 conf/server.xml 加上URIEncoding=“utf-8”,以后get请求过来的数据永远都是用UTF-8编码

二、Post方式

  • 修改请求体内编码方式
  	request.setCharacterEncoding("UTF-8");

原理 :通过修改请求体内编码方式,直接使解码编码选择一致,避免乱码

  • 需要注意的

1.这行设置一定要写在getParameter之前,即在读取数据之前就设置完毕
2.这种方式不适用于 Get 方式


文末总结

  • 乱码核心原因

浏览器的编码解码方式与 JavaWeb 项目中 Servlet 的编码解码方式在请求或响应数据时产生了冲突,不同的编码解码方式自然就引起了乱码的情况

  • 解决乱码的关键

修改浏览器或者 JavaWeb 项目中 Servlet 的编码解码方式,使得两者趋于一致即可

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值