文章主要针对Tomcat中JSP开发容易出现的中文乱码问题。
1、JSP中输出中文的乱码问题
JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等。
原因:
这种情况下的乱码问题往往是因为没有给JSP页面制定显示字符的编码方式。
解决:
在JSP页面头部加上语句<%@ page contentType="text/html; charset=utf-8" %>(在Servlet页面中使用http.ServletResponse.setContentType("text/html; charset=gbk")),最好同时在JSP页面的<head>部门加上<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
2、获取表单提交的数据时(POST方式)
代码如下:
- <!-- radiocheck.jsp -->
- <%@ page contentType="text/html; charset=utf-8" language="java" %>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>单选按钮与复选框</title>
- </head>
- <body>
- <%
- String str1=request.getParameter("radiobutton");
- String str2[]=request.getParameterValues("check");
- if(str1!=null && str2!=null)
- {
- //str1=new String(str1.getBytes("ISO-8859-1"),"utf-8");
- out.println("你经常使用的是"+str1+"上网<br>");
- out.println("经常上网的地方是:");
- if(str2!=null)
- {
- for(int i=0; i<str2.length; i++)
- {
- out.println(str2[i]+" ");
- }
- }
- }
- %>
- <form name="form1" method="post" action="">
- <p>你使用什么方式上网</p>
- <p><input name="radiobutton" type="radio" value="ASDL" checked>ASDL</p>
- <p><input name="radiobutton" type="radio" value="拨号上网">拨号上网</p>
- <p><input name="radiobutton" type="radio" value="无线接入">无线接入</p>
- <p><input name="radiobutton" type="radio" value="DDN专线">DDN专线</p>
- <p>你经常在什么地方上网</p>
- <p><input name="check" type="checkbox" value="home">home</p>
- <p><input name="check" type="checkbox" value="school">school</p>
- <p><input name="check" type="checkbox" value="Internet Bar">Internet Bar</p>
- <p><input name="submit" type="submit" value="Submit"></p>
- </form>
- </body>
- </html>
原因:
在没有加任何其它处理之前,用request.getParameter(paramName) 获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会出现乱码。出现这种情况的原因是Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。
解决:
方法一:
不修改其他设置,只是在将表单中的中文数据提取出来后再转换编码。
例如:代码中对于String str1=request.getParameter("radiobutton");进行转换编码语句如下:
str1=new String(str1.getBytes("ISO-8859-1"),"utf-8");
这种方法只是从一个局部来考虑,如果这样的地方太多,就不得不将这条语句重复写很多次,在比较大的项目中,就需要用方法二。
方法二:
使用过滤器(filter),即让对所有页面的请求都通过一个Filter,将处理字符集设置为utf-8。具体做法如下:在Tomcat的/webapps/examples/(如:F:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/examples/WEB-INF/classes/filters)有一个完整的例子,也可以参考其中web.xml和SetCharacterEncodingFilter的配置。
A:首先将%Tomcat%/webapps/examples/WEB-INF/classes/filters/目录下的文件SetCharacterEncodingFilter.java拷贝到自己Eclipse工程下的src文件里,同时要修改其中的包packet路径,改成正确的packet路径。
B:然后将web.xml文件<web-app>后面添加如下代码:
Xml代码
- <filter>
- <filter-name>SetCharacterEncoding</filter-name>
- <filter-class>com.b2b.alibaba.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>SetCharacterEncoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
3、URL中的中文问题(GET请求)
对于直接通过URL 中传递中文参数,如“http://localhost:8080/liuxl/jsp/radiocheck.jsp?str1=中文”这样的GET请求,在服务端用request.getParameter("paramName")时返回的是乱码。按以上的两种方法都不管用。
例如:
代码同上,只需将<form name="form1" method="post" action="">修改成 <form name="form1" method="get" action="">即可。
原因:
Tomcat中以GET方式提交的请求对query-string处理时采用了和POST不一样的处理方式。
解决:
打开Tomcat安装目录下的/conf/server.xml文件(如:F:/Program Files/Apache Software Foundation/Tomcat 6.0/conf/server.xml),找到Connector块,往其中添加URIEncoding="utf-8",添加后完整的Connector块代码如下:
Xml代码
<Connector port="8080" protocol="HTTP/1.1"
- maxThreads="150" connectionTimeout="20000"
- redirectPort="8443" URIEncoding="utf-8" />