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;
}
}
用的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;
}
}
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);
}
==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|请问该如何读这个文件,不会改变字符?
InputStreamReader read = new InputStreamReader (new FileInputStream(file),"UTF-8");
BufferedReader inBuf=new BufferedReader(read);