问题描述:
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] = 32bytes: -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个中文字,什么方式能正常显示?

解决方案 »

  1.   

    如果oracle中存储的并非乱码,那么就是你的java的事了.
      

  2.   

    楼上的字要显示的话,
    因为是utf8,所以,数组每3个,组成1个汉字,就是0-2,3-5,6-8,9-11,12-14
    用他们生成新的utf8的字符就可以了。
      

  3.   

    byte[24] ,能够得到数组的25,呵呵。厉害呀!
      

  4.   

    -17,-65,-67 换成UNICODE,就是'\uBFFF',好像没有这个字吗.
      

  5.   

    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"));      
                }
      

  6.   

    sqlplus里面显示都不对的话,是比较难了。赫赫。用DUMP函数来看看呢?
    参数用1016。-50   -84,只有2字节,你到底用了什么编码呀。赫赫。
      

  7.   

    select convert(column1, 'ZHS16GBK') 
    from xxxxx
    试试.