下面这段代码中的‘珺’字,只能用缺省的GBK解码,其他解码都显示为问号String hello = "你好李珺";
System.out.println("[test 1-1]: with system default encoding=" + System.getProperty("file.encoding") + "\nstring=" + hello + "\tlength=" + hello.length());
hello = new String(hello.getBytes(), "GB2312");
System.out.println("[test 1-2]: getBytes with platform default encoding and decoding as gb2312:\nstring="+ hello + "\tlength=" + hello.length());
hello = new String(hello.getBytes("UTF8"));
System.out.println("[test 1-3]: convert string to UTF8\nstring="+ hello + "\tlength=" + hello.length());我的数据库编码是zhs16cgb231280,通过JDBC连接取出来,类似‘珺’这样的冷僻字就变成问号了,客户端是中文winxp sp2,nls_lang设置为zhs16cgb231280或zhs16gbk都试过,还是乱码,请问有什么办法处理,可以正常显示呢?先谢了

解决方案 »

  1.   

    转化到其他编码都是问号,就像这样:
    [test 1-1]: with system default encoding=GBK
    string=Hello world 你好李珺     length=16[test 1-2]: getBytes with platform default encoding and decoding as gb2312:
    string=Hello world 你好李?B     length=17hello = new String(hello.getBytes("UTF8"))的结果
    [test 1-3]: convert string to UTF8
    string=Hello world 浣犲ソ鏉庯拷B        length=19hello = new String(hello.getBytes("UTF8"),"UTF8")的结果
    [test 1-3]: convert string to UTF8
    string=Hello world 你好李?B     length=17只有缺省的GBK可以正常解码,长度是16,其他字符集解码都不对,长度是17,冷僻字无法正常显示
      

  2.   

    回复4楼:读取之前编码?问题是怎么实现呢? 
    回复5楼:数据库字符集是zhs16cgb231280
      

  3.   

    打算做数据迁移,通过export/import,原来的库是zhs16cgb231280,新库是zhs16gbk;
    迁的时候发现有很多冷僻字会变成问号,所以想看能不能通过java转换一下读取之前转换倒是可以先把varchar2数据转换为raw类型,然后到目标库,再从raw转会varchar2,通过db link,insert就可以实现;但这样做非常麻烦,而且性能很差,所以就想有没有一种更好的办法,比如通过java
      

  4.   

    你的数据库安装的时候是zhs16cgb231280,客户端环境变量也设置成zhs16cgb231280,
    查询依然乱码。
    说明,你存数据进去的时候就有问题
      

  5.   

    你的数据库安装的时候是zhs16cgb231280,客户端环境变量也设置成zhs16cgb231280, 
    通过pl/sql或者sqlplus等工具查询依然乱码。 
    说明,你存数据进去的时候就有问题
      

  6.   

    数据存储没问题,服务器端和客户端都设置为zhs16cgb231280,sqlplus和plsql读取显示都正常,因为已经在老系统上运行很多年了
      

  7.   

    用weblogic的oci驱动可以解决这个问题,直接用jdbc的话,估计会麻烦一些
      

  8.   

    12:jdbc thin driver 和oracle oci driver我都试过了,好像不行。
    weblogic oci driver这个倒是没试过,oci不是数据库厂商开发的吗?
    13:现在就是要在新库上用更大的字符集GBK,问题是怎么保证老库上的数据迁的时候不会出现冷僻字变问号的问题呢?
      

  9.   

    字符编码不对 换成GBK或者UTF-8
    UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。 GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。 
      

  10.   

    回复16楼:好像gbk和gb2312不是严格的超集/子集关系,有些冷僻字,比如这里的‘珺’就无法正常处理。
      

  11.   

    试一下
    new String(rs.getString("user_name").getBytes("gb2321"))
      

  12.   

    你用jdbc的thin驱动的话,注册表上的字符集改成什么都没有影响的,关键是在rs。getString后要转码,试一下我上面说的,应该是可以的
      

  13.   


    hello = new String(hello.getBytes("UTF8"),"UTF8");这句话怎么可能有问题.hello是什么就会输出什么.
    LZ的输出有问题,是因为你的测试代码写的有问题.
    hello = new String(hello.getBytes(), "GB2312"); 当你使用这句话的时候,已经给hello重新赋了一新值,就是"Hello world 你好李?B    ",已经不是"你好李珺"了.在使用前先给hello赋你要测试的值:hello="你好李珺";
    hello = new String(hello.getBytes("UTF8"),"UTF8");这样就不会有问题了.
    GB2312有问题,是因为GB2312不包含"珺"字,所以显示个?.你可以使用UTF-8连接数据库,只要你的新数据库使用的字符集包含"珺"字,这个"珺"不会有任何问题的.其他字也一样.
      

  14.   

    回复18楼:我试了一下这个方法,还是问号,改注册表对thin driver确实没影响回复20楼:原来的测试代码确实有问题,多谢指点,UTF8数据库取出来以后,不是问号,变成方框了取数据库的测试代码:请看一下        while (rset.next()) { // Point result set to next row
            // Retrieve column values for this row
           try{ 
            String code = rset.getString(1);
            String name = rset.getString(2);
            String partner = rset.getString(3);
            String address = rset.getString(4);
            String phone = rset.getString(5);   
            code = new String(code.getBytes("GB2312"));
            name = new String(name.getBytes("GB2312"));
            partner = new String(partner.getBytes("GB2312"));
            address = new String(address.getBytes("GB2312"));
            phone = new String(phone.getBytes("GB2312")); 
            gui.addToJTable(code, name, partner, address, phone); // Update gui
          }catch (Exception e) {
                System.out.println(e.toString());
            }       
          }
    论坛不能贴图吗?我截屏贴不了
      

  15.   

    写数据是通过中间件,AIX服务器,字符集是zhs16cgb231280,查询是客户端winxp,zhs16cgb231280
    和zhs16gbk都试过登陆到数据库服务器,设置nls_lang=zhs16cgb231280,sqlplus查询这些汉字,显示正常
      

  16.   


      while   (rset.next())   {   //   Point   result   set   to   next   row
                    //   Retrieve   column   values   for   this   row
                  try{  
                    String   code   =   rset.getString(1);
                    String   name   =   rset.getString(2);
                    String   partner   =   rset.getString(3);
                    String   address   =   rset.getString(4);
                    String   phone   =   rset.getString(5);      
                    //直接打印出来看看,应该是正确的,如果你的连接没有问题.不知道你为什么要转?如果你要转也不要用GB2312,包含的字符太少了.
                    gui.addToJTable(code,   name,   partner,   address,   phone);   //   Update   gui
                }catch   (Exception   e)   {
                            System.out.println(e.toString());
                    }              
                } 
      

  17.   

    连接部分的代码:      // Create a OracleDataSource instance
          OracleDataSource ods = new OracleDataSource();      // Sets the driver type
          ods.setDriverType("thin");      // Sets the database server name
          ods.setServerName((String)prop.get("HostName"));      // Sets the database name
          ods.setDatabaseName((String)prop.get("SID"));      // Sets the port number
          ods.setPortNumber(new Integer((String)prop.get("Port")).intValue());      // Sets the user name
          ods.setUser((String)prop.get("UserName"));      // Sets the password
          ods.setPassword((String)prop.get("Password"));      // Create a connection  object
          connection = ods.getConnection();
      

  18.   

    要是你的数据库里的存的就是乱码 那就得弄数据库的编码格式了 要是数据库没有问题的话 最基本的解决的办法就是 String name = rs.getString("user_name");
     new String(name.getBytes("ISO-8859-1"),"GBK");这样所有的都能转过来 要你是用Struts 的话就要继承和重写了 
      

  19.   

    首先。。“珺” 这类字是生僻字,,你的数据库编码的 zhs16cgb231280  也就是gb2312.gb2312是不支持这些生僻字的,,你可以使用gbk。当然现在数据库已经存在这个问题了。不能改了怎么办呢。。
    那么你就 在java 里面   String name = rs.getString("user_name"); 
    new String(name.getBytes("ISO-8859-1"),"GBK");  试一下吧
      

  20.   

    数据库里存储的‘珺’字可以通过sqlplus正常显示,应该是没有问题的,因为数据库字符集和nls_lang都是zhs16cgb231280现在就使通过java取出来就显示成问号,或者方框了刚才试了
    String name = rs.getString("user_name"); 
    new String(name.getBytes("ISO-8859-1"),"GBK");  
    显示所有汉字都变成问号
    这里没用struts,就是非常简单的一个小测试程序,目的其实就是从源库抽数据,然后批量插到新库中
    源库是zhs16cgb231280,新库是zhs16gbk但是,现在遇到的问题就是发现,插入新库以后,这些冷僻字就都变成问号了,通过sqlplus查看也是问号,在java界面显示也是问号
      

  21.   

    String name = rs.getString("user_name"); 
    new String(name.getBytes("ISO-8859-1"),"GBK");  
    支持
    对的
      

  22.   

    我感觉你应该用 new String(name.getBytes("ISO-8859-1"),"GB18030/UTF-8") 试试 看找个大点的能不能正常显示!
      

  23.   

    GB18030/UTF-8显示的汉字都是问号
    用iso-8859-1解码以后,转成其他编码都是问号,不知道为什么
      

  24.   

    new String() 中的2个参数 一个是把我们拿到的String 转成什么样的 比如我没常用的ISO-8859-1 而后面的参数就是我们想要的类型了 Oracle 转型的问题一直都很让人头痛 既然你的数据库的格式是zhs16cgb231280 那你不防就用 zhs16cgb231280 他取一下 例如:new String(rs.getString("ISO-8859-1"),"zhs16cgb231280"); 要是还不行 我也没有办法了 我一般都是用比较大众的方法弄 这样更容易让人理解一些 我发现现在编程最主要的是速度 其他的都是次要的 在期限内拿下项目是最牛的 至于用什么方法和手段 根本不重要 
      

  25.   

    试了一下,运行时报错:
    java.io.UnsupportedEncodingException: zhs16cgb231280冷僻字无法显示的问题,我以前就听说过,有些业务系统因为打发票,姓名的冷僻字就无法处理;但是不知道有没有人解决了这个问题
      

  26.   

    我刚才看了一下 我们论坛就有一篇文章 地址是 http://topic.csdn.net/t/20020906/13/1001612.html
    就是说的编码格式的 感觉还不错 也许能对你有点什么启发!
      

  27.   

    http://topic.csdn.net/u/20090910/18/df5a7313-d27a-49ed-8274-2a11b629371b.html(1)修改 my.ini(MySQL Server Instance Configuration 文件) # CLIENT SECTION [client] port=3306 [mysql] default-character-set=gbk # SERVER SECTION [mysqld] default-character-set=gbk (2)修改data目录中相应数据库目录下的db.opt配置文件 default-character-set=gbk 
    default-collation=gbk_chinese_ci (3)数据库连接串中指定字符集 URL=jdbc:mysql://yourIP/college?user=root&password=yourPassword&useUnicode=true&characterEncoding=gbk 注:在mysql4.1.0版 要加useUnicode=true&characterEncoding=gbk 如果是5.0版以上的,加不加都是没有关系的! (4)在创建数据库时指定字符集 create database yourDB CHARACTER SET gbk; (5)在dos命令上要设置 set names gbk 改变服务器编码必须重启服务器
      

  28.   

    回复37楼:数据库是Oracle,不是MySQL ;)
      

  29.   

    生僻字输出到控制台和GUI界面都试问号,或者方框