bufegar 2007-4-6 14:00
中文乱码不完全解决方法(mdwolf 收集整理)
中文乱码不完全解决方法(mdwolf 收集整理)
中文乱码不完全解决方法(mdwolf 收集整理)
这里主要阐述的是用JAVA开发B/S结构的应用程序时,所遇到的中文乱码问题以及解决方法,
本文局限于俺对乱码问题的理解,不足之处请大家指点纠正,谢谢!
如下图所示:
[img]http://www.newwhy.com/images/tietu/20070406/luanma.png[/img]
我们所遇到乱码问题大致可以分为3种情况:
1.从request信息中取得中文数据:
[java]
String str1 = request.getParameter("name");
if (str1 != null ) {
byte[] bt1 = str1.getBytes("ISO8859_1");//用ISO8859_1进行编码
String str2 = new String(bt1,"GBK");//用GBK进行解码,构建1个新的字符串
}else str1 = "";
[/java]
2.然后我们放在response中输出这个字符串
JSP代码如下:
[java]
<%@ page language=“Java” contentType=“text/html; charset=GBK%>
<%=str2%>
[/java]
3.抓到数据后放入数据库中,有两中方式
1)自己实现结果集RS,利用RS进行数据的存储,其中
从数据库中按照BYTE取得字段记录,然后按照指定的字符集解码构建一个新的字符串;
往数据库中存入的记录也是作为BYTE存入的,并且是按照指定的字符集编码构建一个新的byte存入数据库当中的;
这样一来我们所存入的数据就与数据库的编码集无关了,也就是说我们不用再考虑数据库的编码集
如下转贴 yipsilon 实现的代码
[java]
public class I18nResultSet implements ResultSet{
private String encoding;
private ResultSet rs;
public I18nResultSet(ResultSet rs, String encoding) throws java.io.UnsupportedEncodingException{
//检查该编码名称是否被系统支持。
"".getBytes(encoding);
this.rs = rs;
this.encoding = encoding;
}
… …
//以下几个方法是进行String字符串的重编码.
public String getString(int index) throws SQLException{
String data = null;
try{
data = new String(rs.getBytes(index), encoding);
}catch(java.io.UnsupportedEncodingException uee){}
}
public String getString(Stirng field) throws SQLException{
String data = null;
try{
data = new String(rs.getBytes(field), encoding);
}catch(java.io.UnsupportedEncodingException uee){}
}
public void updateString(int index, String value) throws SQLException{
try{
rs.updateBytes(index, value.getBytes(encoding));
}catch(java.io.UnsupportedEncodingException uee){}
}
public void updateString(String field, String value) throws SQLException{
try{
rs.updateBytes(field, value.getBytes(encoding));
}catch(java.io.UnsupportedEncodingException uee){}
}
… …
}
[/java]
2)使用insert ,update 来更新数据库的方法
[java]
public static String getBytes(String source){
if (source==null) return null;
if (source.length()==0) return "";
char[] chars=source.toCharArray();
byte[] bytes=new byte[source.length()*2];
int index=0;
for (int i=0,charValue=0;i<chars.length&&index<chars.length*2;i++)
{
charValue=(int)chars[i];
if (charValue>255){
try{
byte[] tmp=(new Character(chars[i])).toString().getBytes"GB2312");
for (int j=0;j<tmp.length;j++){
bytes[index]=tmp[j];
index++;
}
}catch(Exception e){
e.printStackTrace();
}
}else{
bytes[index]=(byte)chars[i];
index++;
}
}
return new String(bytes,0,index);
}
[/java]
我们开看看怎样,调用这个方法存储数据
[java]
String a =request.getParameter("name");
if (a!= && !a.equals("")) {
a = getBytes(a);
}
[/java]
改造后的数据,就可以利用Statement往数据库里面存了,这里我们往数据库里存入的数据都是双字节的方式存入数据库的
,这样就保证了不管是中文的数据库还是英文编码的数据库都是以双字节格式存入数据库的,从而保证的数据的完整性,而
我们拿出来用的时候,不要做任何编码转换,直接用就行了.
4.附加一个在内存中使用,可以解决MAIL附件乱码问题的方法(由axman提供):
[java]
public static String gbToUtf8(String src)
{
byte[] b = src.getBytes();
char[] c = new char[b.length];
for(int i=0;i<b.length;i++)
{
c[i] = (char)(b[i]&0x00FF);
}
return new String(c);
}
[/java]