hi, all最近遇到一个问题一直没有解决。 当往数据库里插入特殊字符的时候,出现乱码。
用的bea 的JDBC。 
数据库是oracle 10g , 字符集是utf8.  我的这个程序是没有WEB 界面的,是从TXT文档直接读数据,然后插入数据库。数据是不定的,所以不能用ASCII码。 TXT 也是UTF8 的。
 我直接在代码中这样写,最后数据还是不对。            String test1 = "Jörg Ranau";
            String test2 = "Côte d''Ivoire";            String conStr1 = new String(test1.getBytes("UTF-8"), "UTF-8");
            String conStr2 = new String(test2.getBytes("UTF-8"), "UTF-8");            System.out.println("conStr1="+conStr1);            System.out.println("conStr2="+conStr2);           
            String insertSql = "INSERT INTO PI_TEST (TESTCODE,TESTDESC) values (?,?)";
            pstmt = conn.prepareStatement(insertSql.toUpperCase());
            pstmt.setString(1,test2);
            pstmt.setString(2,conStr2);            pstmt.addBatch();
            pstmt.executeBatch();
jdbc:public static Context getInitialContext() throws Exception {
        try 
        {
                 
         Hashtable<String,String> h = new Hashtable<String,String>();
         h.put(Context.INITIAL_CONTEXT_FACTORY, properties.getProperty("BATCH_JOB_IMPORT_Context_Factory"));
         h.put(Context.PROVIDER_URL, properties.getProperty("BATCH_JOB_IMPORT_Context_URL"));
                       
         return new InitialContext(h);
        } 
        catch (NamingException e) 
        {
                  throw e;
        }
        catch (Exception e)
{
log.error("[getInitialContext] (Exception) General error getting inital context");
     log.error(e.getMessage(), e);
     throw e;
}
    }

解决方案 »

  1.   

    java源文件也采用的UTF-8编码么?
      

  2.   

    谢谢ylz2007 ,bea 下的java 文件 是CP1252. 修改成UTF-8, 直接赋值这种情况可以解决。我还有一个问题就是,我这个程序其实是个BATCH JOB,把用户给的TXT 文件里的数据导入到数据库。 
    TXT文件是用: UTF-8 without BOM, 读文件用的是:
    BufferedReader inBuf = new BufferedReader(new FileReader(file));
    String inHeaderLine = inBuf.readLine();
    拿回数据后,我也做了convertion
    byte[] byteArr1 = contentLine.getBytes("UTF-8");
    String converContentLine = new String(byteArr1, "UTF-8");
    然后保存到ArrayList,
    再然后在放入PreparedStatement, 但是插入到数据库后结果还是不对。
    什么原因呢? if (insertRecArr.get(p) != null && !"".equals(insertRecArr.get(p).toString() )){
                 String strvachar =  insertRecArr.get(p).toString();     String conStr = new String(strvachar.getBytes("UTF-8"), "UTF-8");
                     pstmt.setString(p+1,conStr);
                     log.info("insert test verch conStr =="+conStr);
          }else{
                 pstmt.setNull(p+1, java.sql.Types.VARCHAR);
          }
      

  3.   

    我查看LOG, 发现读文件的时候,打出来的就不对啦。
    ==Jörg Ranau
    ==Côte d''Ivoire查看读文件用的java, 也已经改用的UTF-8。
    读文件用的这个方法。BufferedReader inBuf = new BufferedReader(new FileReader(file));
    String contentLine = inBuf.readLine();
    byte[] byteArr1 = contentLine.getBytes("UTF-8");
    String converContentLine = new String(byteArr1, "UTF-8");查看LOG, 发现读文件后字符就不对了。
     log.info("read file  "+converContentLine);
    read file  999|Côte d''Ivoire|请问该如何读这个文件,不会改变字符?
      

  4.   

    这个读文件就是UTF8,自问自答。
    InputStreamReader read = new InputStreamReader (new FileInputStream(file),"UTF-8");
    BufferedReader inBuf=new BufferedReader(read);