JSP显示中文有乱码怎么办用request得到的用户输入的中文怎么是乱码把汉字写到数据库怎么是乱码等等一些关于汉字乱码的问题其实这个问题很简单管它汉字不汉字还是日文还是其他的什么双字节的语言我们一律把它当作UTF看待
(一)request中的双字节文字
我们来实现在整个应用程序中使用UTF编码工作之所以选择UTF不仅仅之于上述原因我们知道java的就是基于在UTF之上的所以我们选择UTF应该没错
首先把我们的java jsp文件都用UTF编码来保存如果以前的没有用UTF保存也无所谓但是建议以后写的都用UTF来保存
并在jsp里面写:
以下是引用片段
<%@pagecontentType=
text/html;charset=UTF
%>而不是%@pagecontentType=
text/html;charset=UTF
%
然后在web
xml添加下面一段
以下是引用片段
<web
app>
<filter>
<filter
name>SetCharacterEncoding</filter
name>
<filter
class>com
redv
projects
eduadmin
util
filters
SetCharacterEncodingFilter</filter
class>
<init
param>
<param
name>encoding</param
name>
<param
value>UTF
</param
value>
</init
param>
</filter>
<filter
mapping>
<filter
name>SetCharacterEncoding</filter
name>
<url
pattern>/*</url
pattern>
</filter
mapping>
</web
app>
其中com
redv
projects
eduadmin
util
filters
SetCharacterEncodingFilter的代码如下
packagecom
redv
projects
eduadmin
util
filters;
importjava
io
IOException;
importjavax
servlet
Filter;
importjavax
servlet
FilterChain;
importjavax
servlet
FilterConfig;
importjavax
servlet
ServletException;
importjavax
servlet
ServletRequest;
importjavax
servlet
ServletResponse;
importjavax
servlet
UnavailableException;
importjavax
servlet
importjavax
servlet
publicclassSetCharacterEncodingFilter
implementsFilter{
protectedStringencoding=null;
protectedFilterConfigfilterConfig=null;
protectedbooleanignore=true;
publicvoiddestroy(){
this
encoding=null;
this
filterConfig=null;
}
publicvoiddoFilter(ServletRequestrequest
ServletResponseresponse
FilterChainchain)throwsIOException
ServletException{
//Conditionallyselectandsetthecharacterencodingtobeused
if(ignore||(request
getCharacterEncoding()==null)){
Stringencoding=selectEncoding(request);
if(encoding!=null){
request
setCharacterEncoding(encoding);//
Overridesthenameofthecharacterencodingusedinthebodyofthisrequest
ThismethodmustbecalledpriortoreadingrequestparametersorreadinginputusinggetReader()
}
}
//Passcontrolontothenextfilter
chain
doFilter(request
response);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this
filterConfig=filterConfig;
this
encoding=filterConfig
getInitParameter(
encoding
);
Stringvalue=filterConfig
getInitParameter(
ignore
);
if(value==null){
this
ignore=true;
}
elseif(value
equalsIgnoreCase(
true
)){
this
ignore=true;
}
elseif(value
equalsIgnoreCase(
yes
)){
this
ignore=true;
}
else{
this
ignore=false;
}
}
protectedStringselectEncoding(ServletRequestrequest){
return(this
encoding);
}
}
这样我们的request请求就是以UTT编码的在JSP程序中就可以使用requestgetParameter(myKey)来直接得到UTF编码的字符串了而不需要像这样new String(requestgetParameter(myKey)getBytes(ISO) GBK)来解决那些乱码了
(二)数据库处理的双字节文字
另外一个就是写入数据库的问题我们知道我们在使用mysql的时候可以改用这样的url来处理汉字编码问题jdbc:mysql://localhost:/upas?useUnicode=true& characterEncoding=gb那么对于那些我们无法像mysql这样解决的怎么办呢?难道我们每次都这样写吗(wwwliancom)
importjava
sql
*;
Class
forName(
org
gjt
mm
mysql
Driver
);
Connectioncon=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
con=DriverManager
getConnection(
jdbc:mysql://localhost:
/test
root
);
pstmt=con
prepareStatement(
SELECTf
f
FROMtbl
WHEREf
=?ANDf
=?
);
pstmt
setString(
newString(f
getBytes(
GBK
)
ISO
);
pstmt
setString(
newString(f
getBytes(
GBK
)
ISO
);
rs=pstmt
executeQuery();
Stringf
f
;
while(rs
next()){
f
=newString(rs
getString(
)
getBytes(
ISO
)
GBK
);
f
=newString(rs
getString(
)
getBytes(
ISO
)
GBK
);
}
}
finally{
//closeresouces
}
其实我们完全可以这样写
importjava
sql
*;
importcom
redv
sql
encoding
*;
Class
forName(
org
gjt
mm
mysql
Driver
);
Connectioncon=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
con=DriverManager
getConnection(
jdbc:mysql://localhost:
/test
root
);
//接管数据库连接实例
booleancoding=true;
EncodingConnectioncodingConnection=newEncodingConnection(con
coding
ISO
GBK
);
//获得接管后的数据库连接实例
以后直接使用con已经是经过EncodingConnection重新包装过的实例
con=codingConnection
getConnection();
pstmt=con
prepareStatement(
SELECTf
f
FROMtbl
WHEREf
=?ANDf
=?
);
pstmt
setString(
f
);
pstmt
setString(
f
);
rs=pstmt
executeQuery();
Stringf
f
;
while(rs
next()){
f
=rs
getString(
);
f
=rs
getString(
);
}
}
finally{
//closeresouces
}
看看怎么样我们只需要在获取数据库连接的地方稍微修改一下甚至我们可以把它当作参数保存在 properties里面改变coding的布尔值来设定是否使用自动编码转换常常我们可以使用一个Database类来封装获取数据库连接的那段 getConnection以便于我们可以从 javaxsqlDataSource中获取到数据库连接这个时候我们仅仅需要修改我们的Database类即可而不用去搜索所有使用了 rssetString() rsgetString()的地方去加入我们的编码转换代码了