Xpoint
   [напомнить пароль]

Oracle+Java: Изменение кодировки строки из UTF-16 в Windows-1251

Метки: [без меток]
2012-10-31 10:43:12 [обр] Top manager(0/2)[досье]

Имеется:

  1. Oracle 9i
  2. Java 1.3
  3. Файл в кодировке UTF-16
  4. Финальная таблица с полями BLOB, CLOB, NCLOB

Функция:

   public static void file2table(String sql, String fileName, String characterSet, int asByteArray) throws SQLException, IOException {
      Connection con = null;
      Writer writer = null;
      Reader reader = null;
      try {
         con = getConnection();
         PreparedStatement ps=con.prepareStatement(sql);

         reader = new InputStreamReader(new BufferedInputStream(new FileInputStream(new File(fileName))), characterSet);
         BufferedReader br = new BufferedReader(reader);
         String s;
         while ((s = br.readLine()) != null) {
            byte[] defaultBytes=s.getBytes(characterSet);
            String win1251str=new String(defaultBytes, "windows-1251");

            if(asByteArray>0) {
               ps.setBytes(1, defaultBytes);               
               //ps.setBytes(1, win1251str.getBytes("windows-1251"));               
            } else {
               ps.setString(1, s);
            }
            ps.executeUpdate();
         }
         con.commit();
      } finally {
         if (reader != null) {reader.close();}
         if (con != null) {con.close();}
      }
   }

Что я делаю:
1. Пробую прочитать файл и сохранить его в BLOB

   execute immediate 'truncate table i12_lines';
   shell.file2table('insert into i12_lines (i12_blob) values (?)'
                              ,'d:\temp\short.tab'
                              ,'UTF-16'
                              ,1
                           );

Результат: pic1, данные сохранились, это видно если сохранить средствами PL/SQL Developer-а содержимое поля в файл и открыть этот файл в блокноте. Появляется ожидаемый текст.

2. Пробую прочитать файл и сохранить его в BLOB, но уже в кодировке Windows-1251
2.1 Меняю код в функции

            if(asByteArray>0) {
               ps.setBytes(1, defaultBytes);               
               //ps.setBytes(1, win1251str.getBytes("windows-1251"));               
            } else {

на

            if(asByteArray>0) {
               //ps.setBytes(1, defaultBytes);               
               ps.setBytes(1, win1251str.getBytes("windows-1251"));               
            } else {

2.2 Вызываю функцию

   execute immediate 'truncate table i12_lines';
   shell.file2table('insert into i12_lines (i12_blob) values (?)'
                              ,'d:\temp\short.tab'
                              ,'UTF-16'
                              ,1
                           );

Результат: тоже самое, ни чего не произошло, см. pic1

Проблема в том, что код

            byte[] defaultBytes=s.getBytes(characterSet);
            String win1251str=new String(defaultBytes, "windows-1251");

не работает как надо, байты не конвертятся.

спустя 2 минуты [обр] Top manager(0/2)[досье]
В дополнении скажу, что если пытаться вставить переменную s в поля CLOB или NCLOB, то вся кодировка ломается, вставляются одни знаки ?. И проблема даже не в шрифте, как многие могут подумать, а именно в байтах: в HEX видно, что все символы принимают один и тот же код.
спустя 10 часов [обр] Jared(0/26)[досье]

Top manager[досье] в java не разбираюсь, но минутное гугление дает:

String(byte[] bytes, String charsetName)
           Constructs a new String by decoding the specified array of bytes using the specified charset.
String win1251str=new String(defaultBytes, "windows-1251");

Если не ошибаюсь, вы сообщаете конструктору, что байты в вашем массиве нужно воспринимать как строку в win1251, в то время как на самом деле это юникод строка.

Powered by POEM™ Engine Copyright © 2002-2005