字符集高级问题,100求解,希望大家研究

lyvictor 2008-01-07 06:44:32
问题描述:
1、数据库为oramcle,字符集环境为AMERICAN_AMERICA.UTF8,客户端环境为ZHS16GBK,客户端web应用数据入库出库采用ZHS16GBK,汉字均正常。
2、有一数据来源,其他地方别人导入的,sqlplus环境设置为AMERICAN_AMERICA.UTF8,可以正确显示正文
3、我的web客户端查询导入的数据乱码,看自己的数据正常。

采用了以下方法:
1、jsp页面字符集设置
2、java程序转码,各种类型的,如:new String(rs.getString(1).getByte("ISO-8859-1"),"GBK")
3、常用的在web中处理汉字的方法,在web.xml文件中增加filter
均不能显示正确中文。JDBC采用的是Thin方式连接,thin方式不受NLS_LANG环境影响,查过oracle官方文档。
通过rs.getByte(1)得到的内容如下:
b: byte[] = byte[24]
[0] = -17
[1] = -65
[2] = -67
[3] = -17
[4] = -65
[5] = -67
[6] = -17
[7] = -65
[8] = -67
[9] = -17
[10] =-65
[11] =-67
[12] =-17
[13] =-65
[14] =-67
[15] = 32
[16] = 32
[17] = 32
[18] = 32
[19] = 32
[20] = 32
[21] = 32
[22] = 32
[23] = 32
[24] = 32
[25] = 32

bytes: -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, bytes end

以上应该是5个中文字,什么方式能正常显示?
...全文
138 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailang_maxu 2008-01-11
  • 打赏
  • 举报
回复
这是肯定要发生的,把客户端和服务器端的字符集设置一样就可以
Petergepeter 2008-01-11
  • 打赏
  • 举报
回复
select convert(column1, 'ZHS16GBK')
from xxxxx
试试.
Croatia 2008-01-10
  • 打赏
  • 举报
回复
sqlplus里面显示都不对的话,是比较难了。赫赫。

用DUMP函数来看看呢?
参数用1016。

-50 -84,只有2字节,你到底用了什么编码呀。赫赫。

lyvictor 2008-01-09
  • 打赏
  • 举报
回复
Croatia:
编辑字节时弄错了,不好意思,重新从程序中读取字节,以下为准:
[0] = -50
[1] = -84
[2] = -17
[3] = -65
[4] = -67
[5] = -17
[6] = -65
[7] = -67
[8] = -17
[9] = -65
[10] = -67
[11] = -17
[12] = -65
[13] = -67
[14] = -51
[15] = -88
[16] = 32
[17] = 32
[18] = 32
[19] = 32
[20] = 32
[21] = 32
[22] = 32
[23] = 32
[24] = 32

32转码后是空格,可以不管。 -50 -84按GBK转码后是“维”字,个人觉得是在转码过程中无法还原了,
数据库UTF8——>JVM转码丢失?——>thin driver获取丢失??——>rs.getBytes()得到字节码。
问题是采用sqlplus连接可以正常显示汉字,我直接用thin方式连接然后rs.getBytes()得到的无法显示中文。
所以还是程序哪个地方出了问题,我希望以最简单的方式解决问题,就是java转码,但目前无法得到正确的值:
while (rs.next()) {
byte[] b = rs.getBytes(1);
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]+",");
}
String rss = rs.getString(1);
String s = new String(b);
System.out.println("无转码:"+s);
System.out.println("无转码:"+new String(b));
System.out.println("UTF8转码:"+new String(rss.getBytes("UTF-8"), "GBK"));
System.out.println("UTF8转码:"+new String(rss.getBytes("ISO-8859-1"), "UTF-8"));
System.out.println("ISO转码:"+new String(rss.getBytes("ISO-8859-1"), "GBK"));
System.out.println("GBK转码:"+new String(rss.getBytes("GBK"), "GBK"));

System.out.println("UTF8转码:"+new String(b, "UTF-8"));
System.out.println("ISO-8859-1转码:"+new String(b, "ISO-8859-1"));
System.out.println("GBK转码:"+new String(b, "GBK"));
}


rwg202315 2008-01-09
  • 打赏
  • 举报
回复
应该是字符集的问题,转换的时候丢失了字节
Croatia 2008-01-08
  • 打赏
  • 举报
回复
-17,-65,-67 换成UNICODE,就是'\uBFFF',好像没有这个字吗.
Croatia 2008-01-08
  • 打赏
  • 举报
回复
byte[24] ,能够得到数组的25,呵呵。厉害呀!
Croatia 2008-01-08
  • 打赏
  • 举报
回复
楼上的字要显示的话,
因为是utf8,所以,数组每3个,组成1个汉字,就是0-2,3-5,6-8,9-11,12-14
用他们生成新的utf8的字符就可以了。
liuyi8903 2008-01-08
  • 打赏
  • 举报
回复
如果oracle中存储的并非乱码,那么就是你的java的事了.

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧