请问关于jdbc中文处理的问题

chenzhenmin 2002-01-28 03:15:04
我在jsp页面上用jdbc连oracle 8i,结果从结果集中得到的中文为乱码,但是页面上的其他中文显示正常,还有,如果我用jdbc-odbc桥连access数据库,得到的中文也很正常。
我用select userenv('language') from dual 查到的的Oracle 8i的字符集是simplified chinese-china.zhs16gbk.

请问应该如何解决,谢谢!!!!
...全文
68 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
darkxi 2002-01-29
String TestStr = new String(TestStr.getBytes("ISO8859-1"),"GBK");
设储存结果的String为TestStr
回复
gzgangster 2002-01-28
这种错误我也碰到过,是编码问题引起的.
因为JAVA的默认编码是16位的Unicode,而数据库的编码却大都是8位的,解决的办法是把二者的编码强制转换成统一的.
如:new String("需转换的目标文本串","iso-8859-1");即把原本是Unicode编码的字符串转换成iso-8859-1,然后就可以正确存如数据库里了.
另外你也可以考虑不采用JAVA的String(包括跟String有关的,如BufferString等),而是使用byte数组. PreparedStatement.setBytes(int length,byte[] content);
回复
huangkai 2002-01-28
package com.minij2ee.util;

import java.net.URLEncoder;
import java.net.URLDecoder;

/**
uniString类用于String在不同encode间进行转换,用于解决JSP和EJB中的中文问题。
创建uniString时需要指定字符串的编码方式(省略表示使用操作系统默认编码),
以后就可以使用该uniString对象获取字符串的任何一种编码形式而不必关心其原先的编码。
@author huangkai@online.sh.cn
*/
public final class uniString implements java.io.Serializable
{
private String m_str;
private String m_enc;

/**
返回uniString内含的字符串。
*/
public String toString()
{
return m_str;
}

/**
构造一个空的uniString对象,编码方式为操作系统默认编码。
*/
public uniString()
{
m_str="";
m_enc="";
}

/**
构造一个uniString对象,编码方式为操作系统默认编码。

@param str uniString对象内含的字符串。
*/
public uniString(String str)
{
m_str=str;
m_enc="";
}

/**
构造一个uniString对象,编码方式为操作系统默认编码。

@param str uniString对象内含的字符串。
@param enc str指定的字符串的编码方式,常用的有"iso-8859-1","gb2312","GBK","utf-8"等,""表示操作系统默认编码。
*/
public uniString(String str,String enc)
{
m_str=str;
m_enc=enc;
}

/**
将一个uniString连接到当前uniString的尾部。

@param str 连接的uniString。

@return 返回连接后的uniString。
*/
public uniString append(uniString str)
{
m_str+=str.cvt(m_enc);
return this;
}

/**
将uniString转换成enc指定的编码。若uniString的编码同enc相同,则不会进行转换过程,直接返回uniString内含的字符串。

@param enc 转换的编码,常用的有"iso-8859-1","gb2312","GBK","utf-8"等,""表示操作系统默认编码。

@return 返回转换后的字符串,一般用于显示或数据库存储。
*/
public String cvt(String enc)
{
if(m_enc.compareTo(enc)!=0)
{
try
{
byte[] bytes=m_enc.compareTo("")==0?m_str.getBytes():m_str.getBytes(m_enc);
m_str=enc.compareTo("")==0?new String(bytes):new String(bytes,enc);
m_enc=enc;
}
catch(java.io.UnsupportedEncodingException e)
{
throw new RuntimeException("Unsupported encoding type.");
}
}

return m_str;
}

/**
return cvt("gb2312");
*/
public String gb()
{
return cvt("gb2312");
}

/**
return cvt("iso-8859-1");
*/
public String iso()
{
return cvt("iso-8859-1");
}

/**
return cvt("utf-8");
*/
public String utf8()
{
return cvt("utf-8");
}

/**
return cvt("");
*/
public String sys()
{
return cvt("");
}

/**
encode返回将uniString内含字符串编码成7bit后的字符串。uniString内含字符的内容没有改变。
一些特殊的情况下需要使用7bit的编码。
*/
public String encode()
{
try
{
StringBuffer sb=new StringBuffer();
byte[] bytes=m_enc.compareTo("")==0?m_str.getBytes():m_str.getBytes(m_enc);

for(int i =0;i<bytes.length;i++)
{
char ch;
ch=Character.forDigit((bytes[i]>>4)&0xF,16);
sb.append(ch);
ch=Character.forDigit(bytes[i]&0xF,16);
sb.append(ch);
}

return sb.toString();
}
catch(java.io.UnsupportedEncodingException e)
{
throw new RuntimeException("Unsupported encoding type.");
}
}


/**
decode将encode编码的7bit字符串解码,解码后的字符串存储在uniString中。
*/
public void decode(String encodestr)
{
StringBuffer sb=new StringBuffer();
int i=0;

while(i!=encodestr.length())
{
sb.append((char)Integer.parseInt(encodestr.substring(i,i+2),16));
i+=2;
}

m_str=new uniString(sb.toString(),"iso-8859-1").cvt(m_enc);
}
}

回复
p_tangnj 2002-01-28
自己转iso->gbk不行就gbk->iso
回复
ggyy 2002-01-28
关注!
回复
chenzhenmin 2002-01-28
请问哪里可以下载电子版????谢谢!!!
回复
lijunyi 2002-01-28
JAVA2从入门到精通里有介绍
回复
相关推荐
发帖
非技术区
创建于2007-09-28

2.3w+

社区成员

Java 非技术区
申请成为版主
帖子事件
创建了帖子
2002-01-28 03:15
社区公告
暂无公告