中文问题
一、
JSP
页面乱码(中文显示为问号)
现象:
JSP
页面生成的中文数据在浏览器端显示为乱码,但是静态
HTML
代码中文则显示正常。
原因:
TOMCAT5
。
0
中
JSP
页面的默认编码方式是
ISO-8859-1
,在动态生成的
HTML
代码时按照
ISO-8859-1(
西欧字符
)
编码,所以显示中文时全部为问号。
解决方法:在所有的
JSP
页面里加上
<%@ PAGE CONTENTTYPE=”TEXT/HTML;CHARSET=GB2312”>
TOMCAT5.0
在解析
JSP
页面的时会将编码方式改为
GB2312
,这时中文显示正常。
二、
INCLUDE
进来的
JSP
页面的中文乱码
现象:外层
JSP
页面的中文显示正常,但
INCLUDE
进来的
JSP
页面(内层页面)的中文显示乱码。
原因:在外层的
JSP
页面中用上面
<
一
>
中的方法处理之后,外层的
JSP
页面正确的按照
GB2312
的编码方法解析,但内层(即
INCLUDE
进来的
JSP
叶面)还是按照
TOMCAT
的默认编码方式
ISO-8859-1
方式编码,所以造成内层页面的中文显示不正常。
解决方式:同上,
在所有的内层
JSP
页面里加上
<%@ PAGE CONTENTTYPE=”TEXT/HTML;CHARSET=GB2312”>
,中文显示即可恢复正常。
注:同一个
JSP
页面中不能出现两个
<%@ PAGE CONTENTTYPE=”TEXT/HTML;CHARSET=GB2312”>
三、
用
POST
方式提交的表单数据中的中文乱码
现象:用
POST方式提交的表单数据出现乱码。
原因:Tomcat在接收到请求后,并没有能够根据request中的信息设置正确的编码方式,而是采用默认编码方式ISO-8859-1编码,所以提交的表单中文数据全部为问号。
解决:可以添加一个设置字符集的过滤器,将request中的编码方式改为GB2312,TOMCAT就
能正确的将
POST方式提交的数据编码。过滤器的内容如下:
package
filters;
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected
String encoding = null;
protected
FilterConfig filterConfig = null;
protected
boolean ignore = true;
public
void destroy() {
this
.encoding = null;
this
.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//
设置正确的编码方式
if
(ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if
(encoding != null)
request.setCharacterEncoding(encoding);
}
//
传递到下一层过滤器
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this
.filterConfig = filterConfig;
this
.encoding = filterConfig.getInitParameter(
"encoding"
);
String value = filterConfig.getInitParameter(
"ignore"
);
if
(value == null)
this
.ignore = true;
else
if (value.equalsIgnoreCase(
"true"
))
this
.ignore = true;
else
if (value.equalsIgnoreCase(
"yes"
))
this
.ignore = true;
else
this
.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return
(this.encoding); }
}
|
编好了过滤器之后,还要在TOMCAT中配置过滤器。
打开WEB-INF目录下的web.xml文件,添加下面的内容:
<
filter
>
<
filter-name
>
Set Character Encoding
<
/filter-name
>
<
filter-class
>
filters.SetCharacterEncodingFilter
<
/filter-class
>
<
init-param
>
<
param-name
>
encoding
<
/param-name
>
<
param-value
>
GB2312
<
/param-value
>
<
/init-param
>
<
/filter
>
<
filter-mapping
>
<
filter-name
>
Set Character Encoding
<
/filter-name
>
<
url-pattern
>
/*
<
/url-pattern
>
<
/filter-mapping
>
|
四、
在
JAVASERVLET
中输出的中文乱码
现象:在
JAVASERVLET
中用
PRINTWRITER
输出的中文乱码
.
,浏览器接收的
HTML
数据的编码方式为
ISO-8859-1(
西欧字符
)
,
这时如果在浏览器端手动的将页面的编码方式改为
GB2312
或
GBK
则页面的中文显示正常。
原因:
TOMCAT5
。
0
页面的默认编码方式是
ISO-8859-1
,浏览器在收到由
JSP
页面生成的
HTML
数据时也会将
HTML
的数据的编码方式设为
ISO-8859-1,
所以造成页面上的中文字符显示为乱码。
解决方法:
如下面这段代码
:
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.write(“
错误!可能是由于信息已过期!!
”);
out.println("</html>");
首先输出是要将response reset,这个我也不知道什么原因,reset后在按照下面的方式处理。
然后
要告诉浏览器该页面要以什么方式编码,添加。
response.setContentType("text/html;charset=GB2312");
告诉浏览器
HTML
数据的编码是
GB2312
,再将输出的每一句中文改为以
ISO-8859-1
编码方式编码,改完后整个代码如下:
response.reset();
response.setContentType("text/html;charset=GB2312");
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.write(new String("
错误!可能是由于信息已过期!!
".getBytes(),"ISO-8859-1"));
out.println("</html>");
这时输出的中文就能正确的显示了。
五.
在资源文件中的中文数据输出到
JSP
页面上为乱码
现象:用
<BEAN
:
WRITE>
标签在
JSP
页面上输出预先已编入资源文件的中文信息时显示为乱码。
原因:编入资源文件的信息如果不是西欧字符就必须用
NATIVE2ASCII
工具将其编码方式改为
ASCII
编码方式。
解决方法:
NATIVE2ASCII
是
JDK
自带的工具,在
你的
JDK
目录
/BIN
目录下。其使用方法如下
APP.RES
是正常的可看的中文资源文件
APPLICATIONRESOURCES.PROPERTIES
要生成的能正常显示的资源文件
NATIVE2ASCII APP.RES APPLICATIONRESOURCES.PROPERTIES
转换完毕后,使用
<BEAN:WRITE>
标签输出的中文信息就能正确的显示了。