在Jsp文件问题时,中文乱码现象经常遇到,现将处理方法总结一下,供大家参考:
(在各种编码方案中,UTF-8、GBK、GB2312都是支持中文显示的。只是GBK比GB2312支持跟多的字符)
一、JSP页面显示乱码
二、URL传递参数中文乱码
三、表单提交中文时出现乱码
四、数据库连接
一、JSP页面显示乱码
Jsp文件页面显示乱码,这种情况比较好处理,在页面的Page指令加上如下一项就OK了:
<%@ page contentType="text/html; charset=gb2312"%>
注:如果是HTML页面显示乱码,则加上:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
二、URL传递参数中文乱码
当我们把一段中文字符作为参数传递个另一页面时,也会出现乱码情况,
解决方法一如下:
在参数传递时对参数编码,比如
Java代码
1. RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
然后在接收参数页面使用如下语句接收
Java代码
1. keywords=new String(request.getParameter("keywords").getBytes("iso8859_1"));
keywords=new String(request.getParameter("keywords").getBytes("iso8859_1"));
解决方法二:
修改tomcat的server.xml文件中URIEncoding。
Xml代码
1.<Connector
2.debug="0"
3.acceptCount="100"
4.connectionTimeout="20000"
5.disableUploadTimeout="true"
6.port="80"
7.redirectPort="8443"
8.enableLookups="false"
9.minSpareThreads="25"
10.maxSpareThreads="75"
11.maxThreads="150"
12.maxPostSize="0"
13.URIEncoding="GBK"
14.>
15.</Connector>
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>
</Connector>
这个方法主要针对从url中获取字符串的问题。
在tomcat5.0及以上版本,post和get方法在处理编码时有所不同。如果你在url中获取中文就会出现?号。但在tomcat4.1版本没有问题,
因为tomcat4.1的post和get方法在处理编码时是一样的。
三、表单提交中文时出现乱码
Jsp页面采用表单提交时,提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,
而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.setCharacterEncoding("gb2312")对
请求进行统一编码,就实现了中文的正常显示。
这是其中的一种作法,当页面较少时还好,如果页面较多,我每添加新的页面就要加上这句话,所以可以采用过滤器来解决,具体解决步骤如
下:
首先写一个过滤器类,代码如下:
Java代码
1.import java.io.IOException;
2.import javax.servlet.*;
3.public class SetCharacterEncodingFilter implements Filter {
4. private String encoding = null;
5. private FilterConfig filterConfig = null;
6.
7.public void init(FilterConfig filterConfig) throws ServletException {
8. this.filterConfig=filterConfig;
9. this.encoding=filterConfig.getInitParameter("encoding");
10. }
11.
12. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
13. if (request.getCharacterEncoding() == null) {
14. String encoding = getEncoding();
15. if (encoding != null)
16. request.setCharacterEncoding(encoding);
17. }
18. chain.doFilter(request, response);
19. }
20.
21. public void destroy() {
22. this.encoding = null;
23. this.filterConfig = null;
24. }
25.
26. public String getEncoding() {
27. return encoding;
28. }
29.}
import java.io.IOException;
import javax.servlet.*;
public class SetCharacterEncodingFilter implements Filter {
private String encoding = null;
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws
IOException, ServletException {
if (request.getCharacterEncoding() == null) {
String encoding = getEncoding();
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public String getEncoding() {
return encoding;
}
}
然后再在web.xml加上
Java代码
1.<filter>
2. <filter-name>SetCharacterEncodingFilter</filter-name>
3. <filter-class>filter.SetCharacterEncodingFilter</filter-class>
4. <init-param>
5. <param-name>encoding</param-name>
6. <param-value>UTF-8</param-value>
7. </init-param>
8. </filter>
9. <filter-mapping>
10. <filter-name>SetCharacterEncodingFilter</filter-name>
11. <url-pattern>/*</url-pattern>
12. </filter-mapping>
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Set Character Encoding-->这样所有的请求都将交由这个过滤器处理下,这样无论我们添加多少个页面都可以放心了,不用总考虑要
加那么一句代码了.
四、数据库连接
在存取数据库时发生乱码现象,这种现象比较郁闷,处理起来相对复杂一点.
首先要在数据存入数据库时,进行如下编码的转换:如我们要把含有中文的字符串存入数据库,首先:
Java代码
1.String s=request.getParameter("author");
2. String author=new String(s.getBytes("ISO8859_1"),"gb2312");
String s=request.getParameter("author");
String author=new String(s.getBytes("ISO8859_1"),"gb2312");
在从数据库取出展示到页面时,也要经过如下转换:
Java代码
1.String s=rs.getString("author");
2. Stringauthor=new String(s.getBytes("GB2312"),"ISO8859_1");
String s=rs.getString("author");
Stringauthor=new String(s.getBytes("GB2312"),"ISO8859_1");
以上是我总结的对三种Jsp文件中文乱码的处理方法,希望对大家有所帮助.
五、用js提交表单
Java代码
1.在提交前
2.Var str = encodeURI(s); //encodeURI默认是以UTF-8编码
3.接收时
4.String str = java.net.URLDecoder.decode(s,”utf-8”);
在提交前
Var str = encodeURI(s);
接收时
String str = java.net.URLDecoder.decode(s,”utf-8”);
六。页面传值
Java代码
1.传:=new String("参数1".getBytes("GBK"), "ISO8859-1")%>
2.取:=new String(request.getParameter("param1").getBytes(
3. "ISO8859-1"), "GBK")