设定数据库的字符集为中文后,存放取出再转转字符集看看从数据库中读出后转:
str=new String (str.getBytes("ISO-8859-1"),"gb2312");
写入数据库前转:
str=new String (str.getBytes("gb2312"),"ISO-8859-1");

解决方案 »

  1.   


    web 页面加入:
    <%@ page contentType="text/html; charset=gb2312" %>
    如果还不可以,就用如下函数转换
    public static String UnicodeToChinese(String s){
      try{
         if(s==null||s.equals("")) return "";
         String newstring=null;
         newstring=new String(s.getBytes("ISO8859_1"),"gb2312");
         return newstring;
        }
      catch(UnsupportedEncodingException e)
      {
      return s;
      }
      }public static String ChineseToUnicode(String s){
      try{
      if(s==null||s.equals("")) return "";
      String newstring=null;
      newstring=new String(s.getBytes("gb2312"),"ISO8859_1");
       return newstring;
      }
      catch(UnsupportedEncodingException e)
      {
      return s;
     }
      }
      

  2.   

    alphazhao(绿色咖啡) :
    我已经进行过转码, 
    现在的情况是:
    如果客户端是中文, 可以正常显示。(证明数据库中存储的也是正确的)
    如果客户端是英文, 无论怎么转码都不行。
    我试过
    s = rst.getString("c");
    s = new String(s.getBytes("ISO-8859-1"),"gb2312");

    s = new String(s.getBytes("gb2312"),"ISO-8859-1");都不起作用
      

  3.   

    我是Java Application, 不是JSP或Applet
      

  4.   

    既然是出现? 那么一定是再通过http传输时没有正确的对Unicode码进行解析
    try ----------GBK
      

  5.   

    Java Application?估计你用的是UNIX或者Solorias系统,你能把系统支持改为支持中文吗?
    我对Solorias不熟悉,我记得是这样的: vi .cshrc —— 编辑环境
     
     Lang c 改为 Lang zh  如果你懂unix,你一定就懂我的意思,我自己只能表达成这样了! :)然后你把转码去掉,试试看,我的系统虽然用的是JSP的B/S模式,不过我想对你的APPLICATION 应该也有用的!
      

  6.   

    我用的是Solorias6吧,Oracle是8.17。
      

  7.   

    phoenix_zd(天马行空) :
    我的客户端是Windows 2000英文版, 服务器是中文WinXP+中文SQLServer2000
      

  8.   

    那就只能象alphazhao(绿色咖啡) 说的那样了: 
      
      这就是客户端ie的字符集支持问题,比如你访问一个日文网站,而你的浏览器不支持日文!  我也是这么认为的!  
     
      

  9.   

    http://www.csdn.net/expert/topic/1001/1001947.xml?temp=9.022158E-02
      

  10.   

    在你个客护短设置中文字符集就可以了,如果是jsp:
    <%@ page contentType="text/html; charset=gb2312" %>
    如果是servlet:
    response.setContentType("text/html; charset=gb2312");
      

  11.   

    都说了我的程序是Java Application, 不是Jsp或者Servlet
      

  12.   

    问题可能涉及你的数据库中字段保存的数据格式和你取字段时使用的方法,比如数据库中保存的是gb2312的编码,取字段时java会对原字节(也就是数据库中保存的数据的字节)进行转码,转换成unicode字符,客户端是英文的,所以默认的转码方式是ISO-8859-1,但是并不是所有的gb2312码都有ISO-8859-1相匹配,不能匹配的,就会返回?,这也就是为什么rst中是问号的原因,所以在取字段操作中,你应该在程序中设置以下源数据的编码方式,这样取出来的字段才是正确的内容。
      

  13.   

    netstarry:
    多谢您的回答, 不过不好意思, 我不大明白
    "在程序中设置以下源数据的编码方式" 应该怎么做, 请详细一点好吗?
      

  14.   

    如果java在执行sql语句取得查询结果时,没有对数据库中类型为 字符型 的数据作编码转换(因为我也不知道,所以做一些假设来找到问题所在),那你使用
    (注:这段语句以后我还会提到,以后用语句a代替)
    byte[] b = rst.getBytes("c");       
    for (int i = 0; i <= b.length - 1; i ++) {
       System.out.println(b[i]);
    }
    得到的应该不是?,
    这样你使用str=new String (str.getBytes("c"),"gb2312");
    应该能得到正确内容,但你说>我试过
    >s = rst.getString("c");
    >s = new String(s.getBytes("ISO-8859-1"),"gb2312");
    >和
    >s = new String(s.getBytes("gb2312"),"ISO-8859-1");
    >都不起作用你这样做当然不起作用,你在使用s = rst.getString("c");时java就做了编码转换,因为英文平台默认使用了ISO-8859-1,所以s字符串中就已经都是?字符了。建议你分别在中文平台下和英文平台上分别测试 语句a(使用同一个.class文件,至关重要!,不要在不同的平台上分别编译),如果中文平台正常英文平台都是?,说明java在取得查询结果时就对字符型 的数据做了编码转换,
    如果这样的话,你可以试试在编译原程序的时候加入编码信息,用法:
    javac -encoding "gb2312" 
    如果这样都不行的话,可能在英文平台读取数据库中的中文信息就不行了,比如字节输入流在构造时可以取读取方的编码信息为参数,读取时自动转换,但是有些类不允许进行该设置,所以就会调用当前平台的默认编码,如果Statement类是这样不能设置编码信息的类(暂时我不知道如何设置),那就只能在数据库中使用二进制类型保存字符数据了,但是我觉得这种情况的可能性不大我暂时没做过跨平台开发测试,所以只能罗列了所有的可能,希望你能查出原因所在,解决问题
      

  15.   

    好像可以这样
    con 是建立连接的Connection 对象map.put("varchar", Class.forName("Byte"));
    con.setTypeMap(map);这样可能在读取sql类型为varchar类型的数据时,会按照byte也就是字节读入,然后就可以自己进行编码转换了
      

  16.   

    写错了,少了一句话应该是java.util.Map map = con.getTypeMap();
    map.put("varchar", Class.forName("Byte"));
    con.setTypeMap(map);