Java解决中文乱码汇总.docx
《Java解决中文乱码汇总.docx》由会员分享,可在线阅读,更多相关《Java解决中文乱码汇总.docx(13页珍藏版)》请在冰豆网上搜索。
![Java解决中文乱码汇总.docx](https://file1.bdocx.com/fileroot1/2023-1/23/397601c7-91d6-4fbf-807f-01fb240c3e51/397601c7-91d6-4fbf-807f-01fb240c3e511.gif)
Java解决中文乱码汇总
servlet输出乱码解决方法
从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录:
1、<%@pagelanguage="java"import="java.util.*"pageEncoding="uft-8"%>
2、response.setContentType("text/html;charset=uft-8");
3、request.setCharacterEncoding("uft-8");
第一个是JSP页面自动生成时默认当前页面的编码格式。
第二个是通过请求后得到的编码后再通过响应时以这个格式输出。
第三个是请求页面是以这个编码格式显示,通常在servlet里面用这种格式设置编码。
servlet 设置这两行就可以解决乱码
2、response.setContentType("text/html;charset=uft-8");
3、request.setCharacterEncoding("uft-8");
Filter解决中文乱码问题
JavaWeb中交中文经常会出现乱码,想必各位都遇到过吧。
今天跟大家聊聊一种比较常用的方式——Filter过滤。
Filter就是起到一个过滤器的作用,当提交或者获取信息的时候,都会经过Filter,然后Filter会将你传递的信息转换成你设置好的编码格式,从而避免一些中文乱码的情况。
使用Filter过滤需要添加两部分代码,一是配置文件里关于Filter的配置信息;另一个就是Filter里面的过滤代码。
下面一起看一下吧。
web.xml中的配置代码:
CharsetEncodingFiltercom.tgb.drp.util.filter.CharsetEncodingFilterendcodingGB18030--设置你想用的字符集,我这里用的是GB18030-->
CharsetEncodingFilter*.jsp
Filter中的过滤代码:
importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;/***采用Filter统一处理字符集*@authorRonaldinho**/publicclassCharsetEncodingFilterimplementsFilter{privateStringendcoding;@Overridepublicvoiddestroy(){}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("CharsetEncodingFilter--->>>begin");//设置web.xml中配置的字符集request.setCharacterEncoding(endcoding);System.out.println("CharsetEncodingFilter--->>>doing");//继续执行chain.doFilter(request,response);System.out.println("CharsetEncodingFilter--->>>end");}@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{this.endcoding=filterConfig.getInitParameter("endcoding");System.out.println("CharsetEncodingFilter.init()-->>endcoding="+endcoding);}}
PS:
Filter的方法只适合于post的提交方式,对于get的提交方式不起作用,而且get提交存在一定的安全问题,所以建议大家还是用post方式提交数据比较好一些。
另外Filter的作用也不止这一点,它还可以做一些页面访问权限控制的工作等等,今天这里只介绍处理乱码的问题,其他的如果大家有兴趣可以自己研究,或者等小弟日后再写相关的文章跟大家交流。
Java中文乱码汇总
1.要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widnow->preferences->genreal->workspace,在这里设置工作空间的字符编码,我通常都会设置成utf-8
1.1最好的方式就是所有的都统一用一种编码,在所有jsp页面中设置编码为utf-8,这样可以很大程度上避免乱码。
在jsp的开头设置编码
1
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
2.在前台向后台发送请求的时候也可能会出现中文乱码,这里又要分请求的方式,
2.1若是采用get请求出现的中文乱码,那么就有两种解决方法:
第一种就是设置tomcat服务器的server.xml这个文件,找到下面的这个段代码,添加上URIEncoding="UTF-8",这种方法最简单
1
第二种就是在代码中使用String的构造方法转码,首先使用request.getParamter获取到参数,在用这个字符串构造出指定字符编码的String,eg:
?
1
newString(request.getParamter("xxx","utf-8")
若是在js中请求后台,也是使用get的方式请求,还可以使用javascript提供的encodeURI这个方法进行转码,然后再后台java中使用URLDecode.decode()进行解码,在java中有URLEncode.encode(),URLDecode.decode()这个两个方法,一个是转码,一个是解码,对应的jsavascript中也有类似的两个方法。
2.2若采用的是post方式请求后台出现乱码,也有几种方式解决:
第一种使用request.setcharacterencoding这个方法设置请求内容的编码,这个方法只对post方式起作用就,自己也可以自己写一个过滤器来设置编码。
第二种若项目中使用了Struts2,那么很简单,在struts.xml中配置一个参数
?
1
第三种若使用了spring也简单,配置一个spring中提供的拦截器:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//过滤器使用spring类CharacterEncodingFilter
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
//过滤器过滤后的编码为utf-8
utf-8
//过滤所有的路径:
/*代表所有的路径
encodingFilter
/*
3.从后台采用request.getWriter的流形式向前台写内容,若是出现乱码,采用response.setcharacterencoding设置编码,可以解决乱码,还可以采用response.setContentType("text/html;charset=utf-8")来设置页面的编码
4.后台存入数据到数据库中也有可能会出现乱码,在取出来也就是是乱码,解决的方式就是设置数据库的字符编码,设置字符编码为utf-8,这个要看使用的什么数据库,这里说下mysql中设置数据库中的编码,在数据安装完成之后配置mysql数据库的字符编码为utf-8;若是数据库已经安装了可以到mysql的安装目录中找到配置启动方式:
Java中文乱码汇总2
在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有如下几个方面:
页面乱码、参数乱码、表单乱码、源文件乱码。
下面来逐一解决其中的乱码问题。
一、JSP页面中文乱码
在JSP页面中,中文显示乱码有两种情况:
一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。
先看一个JSP程序:
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*" %>
2.
3.
4.
中文显示示例 5.
6.
7.
8. 这是一个中文显示示例:
9. <%
10. String str = "中文";
11. out.print(str);
12. %>
13.
14.
上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。
运行后在浏览器中显示如图所示
原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改成如下所示即可
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %>
2.
3.
4.
中文显示示例 5.
6.
7.
8. 这是一个中文显示示例:
9. <%
10. String str = "中文";
11. out.print(str);
12. %>
13.
14.
再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,于是乱码消失。
二、URL传递参数中文乱码
一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
下面是一个示例程序
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
2.
3.
4.
URL传递参数中文处理示例 5.
6. <%
7. String param = request.getParameter("param");
8. %>
9.
10. param='中文'">请点击这个链接
11. 你提交的参数为:
<%=param%>
12.
13.
上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图
对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。
在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下
[html]viewplaincopyprint?
1.2. connectionTimeout="20000"
3. redirectPort="8443" />
在原来代码中添加URI编码设置URIEncoding=“gb2312”即可,重启Tomcat服务器可以得到正确的页面。
其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。
三、表单提交中文乱码
对于表单的数据可以使用request.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。
示例代码如下
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
2.
3.
4.
Form中文处理示例 5.
6.
7.
8. 下面是表单内容:
9.
14.
15.
16.
在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*"
2. contentType="text/html;charset=gb2312"%>
3.
4.
5.
Form中文乱码 6.
7.
8. 下面是表单提交以后用request取到的表单数据:
9. <%
10. String userName = request.getParameter("userName");
11. String password = request.getParameter("password");
12. out.println("表单输入userName的值:
" + userName + "
");
13. out.println("表单输入password的值:
" + password + "
");
14. %>
15.
16.
17.
在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入的数据中有中文的时候,得到的结果如图所示。
产生种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。
对于这个问题可以采用转换编码格式的方法来解决,现在对AcceptFromCharset这个页面改动如下:
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*"
2. contentType="text/html;charset=gb2312"%>
3.
4.
5.
Form中文乱码 6.
7.
8. 下面是表单提交以后用request取到的表单数据:
9. <%
10. String userName = request.getParameter("userName");
11. String password = request.getParameter("password");
12. out.println("表单输入userName的值:
" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "
");
13. out.println("表单输入password的值:
" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "
");
14. %>
15.
16.
17.
经过这样的转换编码以后,所有的中文输入都可以用request对象正常取出。
在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,然后在用GB2312的编码格式重新构造一个新的字符串。
这样就可以支持中文变淡输入的正常取值和显示。
改进以后程序运行结果如下
经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到解决。
但是如果上面的表单中的输入项不止是两个,那么每个输入项都需要进行编码转换,那样就很麻烦了。
这是我们就用到了大名鼎鼎的过滤器filter了。
关于这里的内容大致的思虑和上面的一样具体做法请参照笔者的另一篇文章。
四、Eclipse中JSP文件中文乱码
在Eclipse或者MyEclipse中由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP文件时会出现乱码,如图所示
对于这个问题我们只需要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就可以了,修改的地方(我的MyEclipse版本为11)如图所示
PS
在Eclipse或者MyEclipse当中JSP文件默认的编码为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存,例如如下代码
[java]viewplaincopyprint?
1.<%@ page language="java" import="java.util.*" %>
2.
3.
4.
中文显示示例 5.
6.
7.
8. 这是一个中文显示示例:
9. <%
10. String str = "中文";
11. out.print(str);
12. %>
13.
14.
修改后在保存