`

JSP开发中文乱码问题

阅读更多

文章主要针对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>后面添加如下代码:

	<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>

 

        C:编译运行,所有乱码问题解决。 

 

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块代码如下:

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics