VPF::Как узнать кодировку String? — Форум программистов

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

Имеется:

  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/ 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");

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

иллюстрация (11 KB)


You can use the Message Elements alternative region of the Oracle Alert Options form to define constant text that you want to appear in your message actions.

   To define constant text in your message actions:

    1. Navigate to the Oracle Alert Options form.
    2. Display the Message Elements alternative region.
    3.

    Java 8 строки

    Select the message text option you want to specify constant text for. There are four message text options that you can edit:

If you edit the text for the Message Action Header, Message Action Footer, or Response Text options, messages that you reconstruct using the Review Alert Actions window will show the current text, not the version of the text that was sent with the original message.

    4. Enter or edit the text for the selected option in the Text field below.

See Also

Overview of Response Processing


Следующий метод решает проблему с помощью juniversalchardet , который представляет собой порт Java библиотеки обнаружения кодировки Mozilla.

Вышеприведенный код был протестирован и работает как намеренный. Просто добавьте juniversalchardet-1.0.3.jar в путь к классам.

Я тестировал как juniversalchardet, так и jchardet . Мое общее впечатление заключается в том, что juniversalchardet обеспечивает лучшую точность обнаружения и более удобный API двух библиотек.


Вот мой фаворит: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

Он работает следующим образом:

  • Если есть спецификация UTF-8 или UTF-16, верните эту кодировку.
  • Если ни один из байтов не имеет бит старшего разряда, верните ASCII (или вы можете заставить его вернуть 8-битную кодировку по умолчанию).
  • Если есть байты с высоким набором бит, но они расположены в правильных шаблонах для UTF-8, верните UTF-8.

    Сказ про кодировки и java

  • В противном случае верните стандартную кодировку платформы (например, windows-1252 в системе Windows на английском языке).

Это может показаться чрезмерно упрощенным, но в моей повседневной работе он более 90% точнее.


Проверьте jchardet


Без индикатора кодирования вы никогда не узнаете наверняка. Однако вы можете сделать некоторые разумные догадки. См. Мой ответ на этот вопрос,

Как определить, содержит ли строка строку с неверными кодированными символами

Используйте методы validUTF8 (). Если он возвращает true, рассматривайте его как UTF8, иначе как Latin-1.


Добавить комментарий

Закрыть меню