.№爱の冰封
开始懂得逢场作戏,虽然有许多只是雾水情缘; 不过没关系了,哪来那么多一生一世
BlogJava
首页
新随笔
联系
聚合
管理
posts - 14, comments - 37, trackbacks - 0
j2ee开发中乱码问题的解决方案汇总
先说我的问题吧, 然后再把各个高手的文章贴出来,
我今天使用hibernate的时候改变了数据的编码, 不再使用
html encode ,
结果就出现了编码的问题了, 由于hibernate的本质是jdbc,就去改hibernate的设置, 现在发现原来是jdbc的格式问题,
applicationContext.xml中的数据库连接必须设置为<property>jdbc:mysql://localhost/dbname?useUnicode=true
&
characterEncoding=gb2312</property>不应该是 jdbc:mysql://localhost/dbname?useUnicode=true
&
characterEncoding=gb2312
这是非常关键的!!!
然后我的程序就正确的显示中文了, 好了, 现在把高手的文章列表出来。
http://www.ziki.cn/blog/archives/1155307798.html
http://www.matrix.org.cn/thread.shtml?topicId=25997&forumId=27 这篇超赞!
http://www.zhuoda.org/lunzi/60912.html
下面把那个非常棒的文章转来珍惜一下
本文以最常见的JSP+MySQL+Tomcat+Apache乱码解决为例,望能为你的环境配置起到抛砖引玉之效!
乱码问题已历来已久,在开源环境下,乱码问题更是令程序员措手不及。本人在Unix(Freebsd)下的一次乱码经历可谓经典,故撰以此文以滋效尤!
我将本次所遇乱码归为三类:
1.页面字符乱码
2.记录显示乱码
3.request传递乱码
以下将对上述三类乱码进行解析:
一.页面字符乱码:
1.大小写不一致:
org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=gb2312, new: text/html;charset=GB2312)
2.间隔不一致:
org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charset=GB2312, new: text/html;charset=GB2312)
*解决方案:
首先,在Apache中增加AddDefaultCharset GB2312或AddDefaultCharset GBK
其次,统一使用页面编码定义,如:<%@page contentType="text/html;charset=GB2312"%>
*注:GB2312为GBK之子集。
二.记录显示乱码:
1.MySQL默人语言为latin1_swedish_ci,即拉丁语,所以取出的中文全是乱码。
*解决方案:
1.将charset设为8859_1即:<%@page contentType="text/html;charset=8859_1"%>
这个方法只能暂时缓解字符显示问题,并权益之计。因为8859_1为字节型字库,并非字型字库,故在非全角状态下,将出现半字乱码,表现为“?”。
2.在数据库连接语句中加上?useUnicode=true;characterEncoding=GBK,如:
jdbc:mysql://localhost/dbname?useUnicode=true;characterEncoding=GBK
* 注:一般教科书上都会加上localhost:3306,因为默认端口为3306,故可舍去!同时,请使用连接池的朋友注意,在注册xml文件时,是不可 以单独出现“;”的,所以必须使用“&”,即:jdbc:mysql://localhost/dbname?useUnicode= true&characterEncoding=GBK。
否则提示出错:
Parse Fatal Error at line 213 column 91: The reference to entity "characterEncoding" must end with the ';' delimiter.
org.xml.sax.SAXParseException: The reference to entity "characterEncoding" must
end with the ';' delimiter.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Un
known Source)
也曾有人提意:在MySQL的my.ini文件中加入default-character-set=gbk,本人不赞同此法,因为这样破坏了原有的环境,除非这是MySQL的第一个站点。
三.request传递乱码:
1.也许,此时你已经可以正常使用系统了,那么恭喜~乱码问题已经离开你了!但是,大伙通常都没那么走运,乱码问题依旧存在。也许,这时你向数据库添加 了一条记录以测试系统,可是此时显示出的还是乱码。那么可以肯定是Request参数传递出错!那么先写个测试语句:<%= request.getParameter(“Para”) %>,OK,果然是乱。那么,现在有两种解决方法。
*解决方案:
1.加上这条语句:request.setCharacterEncoding("gbk");
在一/两页上可行,但此法也非权益之计。
2.注册SetCharacterEncodingFilter类:
首先,编写SetCharacterEncodingFilter.java文件,代码如下:
1
package
cn.com.jsp;
2
3
import
java.io.IOException;
4
import
javax.servlet.Filter;
5
import
javax.servlet.FilterChain;
6
import
javax.servlet.FilterConfig;
7
import
javax.servlet.ServletException;
8
import
javax.servlet.ServletRequest;
9
import
javax.servlet.ServletResponse;
10
import
javax.servlet.UnavailableException;
11
12
public
class
SetCharacterEncodingFilter
implements
Filter
{
13
protected
String encoding
=
null
;
14
protected
FilterConfig filterConfig
=
null
;
15
protected
boolean
ignore
=
true
;
16
17
public
void
destroy()
{
18
this
.encoding
=
null
;
19
this
.filterConfig
=
null
;
20
}
21
22
public
void
doFilter(ServletRequest request, ServletResponse response,
23
FilterChain chain)
throws
IOException,
24
ServletException
{
25
26
//
Conditionally select and set the character encoding to be used
27
if
(ignore
||
(request.getCharacterEncoding()
==
null
))
{
28
String encoding
=
selectEncoding(request);
29
if
(encoding
!=
null
)
{
30
request.setCharacterEncoding(encoding);
31
}
32
}
33
34
//
Pass control on to the next filter
35
chain.doFilter(request, response);
36
37
}
38
39
public
void
init(FilterConfig filterConfig)
throws
ServletException
{
40
41
this
.filterConfig
=
filterConfig;
42
this
.encoding
=
filterConfig.getInitParameter(
"
encoding
"
);
43
String value
=
filterConfig.getInitParameter(
"
ignore
"
);
44
if
(value
==
null
)
{
45
this
.ignore
=
true
;
46
}
else
if
(value.equalsIgnoreCase(
"
true
"
))
{
47
this
.ignore
=
true
;
48
}
else
if
(value.equalsIgnoreCase(
"
yes
"
))
{
49
this
.ignore
=
true
;
50
}
else
{
51
this
.ignore
=
false
;
52
}
53
54
}
55
56
protected
String selectEncoding(ServletRequest request)
{
57
return
(
this
.encoding);
58
}
59
60
}
61
此文件为request过滤类,在全局编译前需进行注册。
注册文件为:<%wwwroot%>/WEB-INF/web.xml。
在此文件中加入如下代码即可:
1
<
web-app
>
2
<
display-name
>
wwwroot
</
display-name
>
3
<
description
>
MySQL Test App
</
description
>
4
<
filter
>
5
<
filter-name
>
setCharacterEncodingFilter
</
filter-name
>
6
<
display-name
>
setCharacterEncodingFilter
</
display-name
>
7
<
description
>
setCharacterEncodingFilter
</
description
>
8
<
filter-class
>
cn.com.jsp.SetCharacterEncodingFilter
</
filter-class
>
9
<
init-param
>
10
<
param-name
>
encoding
</
param-name
>
11
<
param-value
>
GBK
</
param-value
>
12
</
init-param
>
13
</
filter
>
14
<
filter-mapping
>
15
<
filter-name
>
setCharacterEncodingFilter
</
filter-name
>
16
<
url-pattern
>
/*
</
url-pattern
>
17
</
filter-mapping
>
18
……
19
</
web-app
>
20
OK,现在可以编译你的SetCharacterEncodingFilter.java文件啦!
至此,乱码将与你格格不入!
posted on 2007-07-10 10:24
冰封的爱
阅读(345)
评论(0)
编辑
收藏
所属分类:
J2EE
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
java日期操作 及 Timer定时器
大型B/S系统的并发问题
定义一个内部类的比较器,比较两个对象并且进行排序
Spring+hibernate+DWR整合
获得汉字拼音首字母(java版)
根据拼音首字母查询人名(C#版)
java开源项目
在 Java 应用程序中计划重复执行的任务(转)
如何使用ejb3持久化中callback
EJB3 QL查询
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔档案
2007年9月 (1)
2007年8月 (6)
2007年7月 (3)
2007年6月 (3)
文章分类
J2EE(64)
Linux(8)
常用工具(9)
开源项目(3)
技术(9)
文章档案
2009年1月 (1)
2008年4月 (1)
2008年1月 (1)
2007年10月 (2)
2007年9月 (2)
2007年8月 (1)
2007年7月 (73)
2007年6月 (12)
相册
冰封的相册
搜索
最新评论
1. re: 自动生成32位永不重复ID
444
--22
2. re: 根据拼音首字母查询人名(C#版)[未登录]
好用,谢谢
--123
3. re: java中生成32位随机ID [未登录]
手术
--想
4. re: Jocky混淆JAVA代码(保护你的JAVA项目)
求支持 JDK 1.7的版本
--pro
5. re: Jocky混淆JAVA代码(保护你的JAVA项目)
8530
--ss
阅读排行榜
1. 学会放下(640)
2. 项目人生(392)
3. IT外包值得体验(390)
4. 小型软件公司如何做大(383)
5. 2007年7月每日一句汇总(1)(354)
评论排行榜
1. 学会放下(0)
2. 2007年7月份 每日一句汇总(2)(0)
3. 2007年7月每日一句汇总(1)(0)
4. 英语每日一句(0)
5. IT外包值得体验(0)