Java Web项目中解决中文乱码方法总结

来源:互联网 发布:加密软件 dg 编辑:程序博客网 时间:2024/05/18 02:21

一、了解常识:

1.UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;
2、web tomcat:默认是ISO8859-1,不支持中文的
3.Java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;
4.getBytes() 是通过平台默认字符集进行编码;

二、引入

在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置;而在Servlet中,也会遇到中文乱码问题;
比如:

OutputStream out = response.getOutputStream();out.write(String );

输出中文时可能会出现乱码;
比如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          OutputStream out = response.getOutputStream();          String data = "博客";          out.write(data.getBytes("UTF-8"));  

输出乱码的问题是程序用UTF-8编码,而浏览器默认用GBK解码了,因此会出现乱码;

三、Servlet相关的几种乱码

1、浏览器调用jsp,html等页面中文显示乱码
此情况需满足两个要求:
(1)文件本身是以utf-8编辑保存的(myEclipse中在properties中鼠标右键选择utf-8)
(2)浏览器用utf-8解析:
(手动)==> 在浏览器中右键选择编码格式为utf-8
(智能)==> 在文件中写入如: 通过标签模拟response头,起到告诉浏览器用utf-8的编码解析
(智能)==> response.setContentType(“text/html;charset=UTF-8”);起到告诉浏览器用utf-8的编码解析
常用:

<meta name="content-type" content="text/html; charset=UTF-8"><meta charset="utf-8"><%@ pageEncoding="utf-8"%><?xml encoding="UTF-8"?>

2、通过浏览器调用servlet,页面显示乱码。
Servlet乱码分为request乱码和response乱码;
(1)response乱码问题
解决方法:
在网上很有效的解决方法是添加:
response.setCharacterEncoding(“UTF-8”);
解决不了,后来又搜到一条解决方法是:
response.setContentType(“text/html;charset=utf-8”);或者 response.setHeader(“content-type”,”text/html;charset=UTF-8”);告诉浏览器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在拦截器Filter中设置字符编码,则无此方法,因为Filter的doFilter方法的参数类型是ServletResponse)
两句都填上,后来终于解决了这个问题;
其实我们应该思考一下本质:
response.setContentType(“text/html;charset=UTF-8”); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;
response.setCharacterEncoding(“UTF-8”);目的是用于response.getWriter()输出的字符流的乱码问题。如果是response.getOutputStream()是不需要此种解决方案的,因为这句话的意思是为了将response对象中的数据以UTF-8解码后的字节流发向浏览器;
==> 情况一:
问题代码如【引入】的例子

我们这里先来说明一下错误的原因,下图是显示乱码的流程图:
这里写图片描述

解决方案流程图:
这里写图片描述
==>情况二:
问题代码如下

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {            PrintWriter out = response.getWriter();            String data = "博客";            out.println(data);          }  

浏览器输出的结果为: ??
原因:”博客”首先被封装在response对象中,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1进行编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”表示没有编码;
错误代码流程图:
这里写图片描述
而解决方案是:response.setCharacterEncoding(“GB2312”); 设置response使用的码表
解决方案流程图:
这里写图片描述
这里写图片描述
(2)request乱码问题
request请求分为post和get,对于不同的请求方式有不同的解决乱码的方案;
==>POST请求:
错误原因:

解决方案:
这里写图片描述
==>GET请求(URI方式传递参数乱码):
出现情况:浏览器访问
如:显示用户名和密码

解决方法:问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding(“utf-8”)也无法解决问题。

法一:要解决这个问题,修改tomcat服务器的配置文件。修改tomcat目录下的conf/server.xml文件的第43行:

修改前内容:

<Connector port="8080" protocol="HTTP/1.1"     maxThreads="150"   connectionTimeout="200000"     redirecPort="8443"/>

修改后内容:

<Connector port="8080" protocol="HTTP/1.1"     maxThreads="150"   connectionTimeout="200000"     redirecPort="8443"    URIEncoding="utf-8"/>

法二:String usernameString = new String(username.getBytes(“ISO-8859-1”),”UTF-8”); (如下图)
法三:URL转换

这里写图片描述

3、调用数据库出现乱码
安装数据的时候选择UTF-8

四、JSP相关乱码解决方案(部分已经在上面介绍了)
问题描述:通过jsp,html,或servlet中的表单元素把参数提交给对应的jsp或者servlet时,在接收的jsp或servlet中接收到的参数中文显示乱码。

例如:

提交jsp代码如下:

<%@ page language="java" pageEncoding="utf-8"%><html><head><title>输入表单</title></head><body><form id="inputForm" name="inputForm" method="post" action="display.jsp">      用户名:<input type="text" name="username"/><br/>      密   码  :<input type="password" name="password"/><br/>     <input type="submit" name="submit" value="提交"/></form></body></html>

接收参数的jsp代码如下:

<% @  page language="java" pageEncoding="utf-8"%><html><head><tilte>接收表单</title></head><body>     <% 在这里插入           request.setCharacterEncoding("utf-8");      %>       用户名:<%=request.getParameter("username")%><br/>      密     码:<%=request.getParameter("password")%><br/></body></html>

解决方法:在接收post提交的参数前,使用request.setCharacterEncoding(“utf-8”)设定接收参数的内容格式为utf-8编码。见接收表单中的插入内容即可。当然这种乱码问题最好使用中文过滤器的方法最好。
五、properties文件乱码
问题描述:在使用一些类库或者框架时,为了实现页面内容国际化,需要编写对应的properties文件。而properties文件中的中文内容在显示的时候也会出现乱码。

解决方法:这个乱码问题可以通过jdk中的native2ascii工具解决。使用如下命令:

native2ascii -encoding utf-8 display.properties display_zh_CN.properties

出现乱码问题的原因是因为java编译器只能处理Latin-1或unicode编码的字符文件。

转载地址:http://blog.csdn.net/haitianxiaowu1/article/details/52460105

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 转让店铺后悔了怎么办 蘑菇街没有流量怎么办 淘宝店没有生意怎么办 蘑菇街直播封号怎么办 淘宝忘记给赠品怎么办 直通车的占比高怎么办 赠品质量有问题怎么办 淘宝赠品有问题怎么办 顾客叫送赠品怎么办 淘宝展现量低怎么办 dw模板不更新怎么办 闭水试验漏水怎么办 绘声绘影试用过了怎么办 探探被选成试用新版用户怎么办 淘宝被限制评论怎么办 信用钱包套路了怎么办 农业银行还贷迟了一天怎么办 淘宝限购一件怎么办 小米盒子电视打不开怎么办 手机淘宝总是卡怎么办 淘宝相机不能用怎么办 作业盒子没声音怎么办 作业盒子闪退怎么办 双面羊绒缩水了怎么办 作业盒子为静音怎么办 没有上进心的人怎么办 孩子不听老人话怎么办 淘宝分销没有视频怎么办 孕妇血糖稍高怎么办 苹果6s 卡怎么办 花呗额度用完怎么办 手机百度网站无法访问怎么办 手机应用删不了怎么办 华为p4屏幕切换怎么办 手机搜不到设置怎么办 华为手机设置成怎么办 手机截屏模糊怎么办 图片上传不清晰怎么办 手机截屏不清楚怎么办 恢复的照片模糊怎么办 手机照片虚了怎么办