C4 中文乱码
JSP
的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法。
C4.1 HTML中文编码转换
在
JSP
文件中的静态文字显示乱码,则需要在
之间增加中文设置代码,如清单附
C-5
所示。
<
meta
http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
charset
指定
UTF-8
字符集,当然也可以指定其他支持中文的编码,如
GBK
和
GB2312
。但是整个
Web
应用中一定要统一一种编码,本书推荐统一为
UTF-8
编码。
C4.2 JSP中文编码转换
针对
Tomcat
下动态内容的中文乱码问题,有以下几个解决办法:
1.
在每个
JSP
文件的开头增加如下代码:
<%@
page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
|
2.
设置编码参数:
request.setCharacterEncoding(
"UTF-8"
);
|
3.
使用编码过滤器。创建过滤器类
SetCharacterEncoding
,源码如清单附
C-5
所示。
清单附
C-5
SetCharacterEncoding.java
|
package
chapc;
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;
public
class
SetCharacterEncoding
implements
Filter {
@Override
public
void
destroy() {
}
@Override
public
void
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws
IOException, ServletException {
//
设置字符编码
request.setCharacterEncoding(
"UTF-8"
);
//
将控制传到下一个过滤器,如果没有过滤器则传到被调用者
chain.doFilter(request, response);
}
@Override
public
void
init(FilterConfig arg0)
throws
ServletException {
}
}
|
过滤器类还需要在
web.xml
中进行配置,设定要过滤哪些请求。过滤器在
web.xml
中的配置如清单附
C-6
所示。
清单附
C-6 web.xml
片段
|
<
filter
>
<
filter-name
>
SetCharacterEncoding
filter-name
>
<
filter-class
>
chapc.SetCharacterEncoding
filter-class
>
filter
>
<
filter-mapping
>
<
filter-name
>
SetCharacterEncoding
filter-name
>
<
url-pattern
>
/*
url-pattern
>
filter-mapping
>
|
方法
1
、方法
2
和方法
3
经常需要使用,但它们一般不是独立使用,而是两两结合:
1
和
2
结合;
1
和
3
结合。附录
A
中的示例用到了
1
和
2
的结合。第四章
Hibernate
中的信息发布系统用到了
1
和
3
的结合。
4.
修改
Tomcat
根目录中
conf
子目录下的
server.xml
文件,在中加入
URIEncoding="UTF-8"
,如清单附
C-7
所示。
清单附
C-7 server.xml
片段
|
<
Connector
connectionTimeout="20000"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/>
|
该方法用来解决浏览器地址栏中的传递中文参数导致的乱码问题。浏览器地址栏传递参数(
URL
传参)一般表现为三种情况:
form
表单的
get
方法提交、超链接传参和
response
传参。
?
form
表单提交方法是
get
:
<
form
action="registerProcess.jsp" method="get">
|
?
在超链接中传递中文参数:
<
a
href="a.jsp?p=
中文参数
"
>
超链接传递中文参数测试
a
>
|
5.
如果是调用
response.sendRedirect
传递中文参数产生的乱码,如:
response.sendRedirect(
"a.jsp?p=
中文参数
"
);
|
请修改成如:
<%
//
引入
URLEncoder
%>
<%@
page
import="java.net.URLEncoder"%>
<%
String p =
"
中文参数
"
;
//
对中文参数编码
p = URLEncoder.encode(p,
"UTF-8"
);
response.sendRedirect(
"a.jsp?p="
+ p);
%>
|
以解决乱码问题。
如果方法
4
还不能解决某些超链接传参乱码问题,请使用方法
5
,如下:
<%@
page
import="java.net.URLEncoder"%>
<%
String
p =
"
中文参数
"
;
//
对中文参数编码
p = URLEncoder.encode(p,
"UTF-8"
);
%>
<
a
href="a.jsp?p=<%=p %>">
超链接传递中文参数测试
a
>
|
6.
JavaScript
中如果出现
URL
传参乱码问题,如:
open(
"a.jsp?p=
中文参数
"
);
|
请修改成:
<
script
type="text/javascript">
function
openWindow()
{
var
url =
"a.jsp?p=
中文参数
"
;
url = encodeURI(url);
open(url);
}
script
>
<
input
type="button" value="JavaScript
中文参数
"
onclick="openWindow();">
|
以解决乱码问题。
JavaScript
中的
open
方法打开浏览器窗口,传递参数,其本质也是
URL
传参。一般方法
4
就可以很好的解决中文参数乱码问题。如果方法
4
不生效,才考虑方法六。
C4.3 MySQL数据库中文编码转换
在设定连接数据库
URL
时指定字符编码,可以确保数据正确的现实在网页上:
jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8;
|
C4.4 存在的问题与题外话
1.
存在问题
在第二节的第四部分提到了修改
Tomcat
根目录中
conf
子目录下的
server.xml
文件,以支持在
URL
中传递中文参数。
这种方法存在一个问题,就是
Tomcat
服务器下可能不止一个
Web
应用,而多个
Web
应用的编码又不一样,这个时候就不能修改
server.xml
了。可以尝试采用:
String p = new String(p.getBytes(“
源编码
”),”
目标编码
”)
|
源编码可以是:
ISO-8859-1
、
GB2312
和
GBK
等合法编码;
目标编码为:
UTF-8
、
GBK
和
GB2312
等合法编码。
用户在使用这个方法的时候需要确定源编码和目标编码各是什么,才能解决中文乱码问题。
2.
题外话
数据库的编码问题除了可以修改连接
URL
之外,也可以采用方法:
String p = new String(p.getBytes(“
源编码
”),”
目标编码
”)
|