Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Кодировка в выборке из MsSQL 2000 через JDBC


Автор: zuzukrukov 3.9.2009, 19:41
Есть сервлет, который осуществляет подключение к базе MsSQL 2000 и делает оттуда выборку, а затем отправляет полученные данные клиенту. Но в браузере выводится текст с неправильной кодировкой (латинские символы с черточками, точечками и прочими).

Что проверял:
1. Кодировку response.
2. Кодировку всей статики
3. Пытался конвертировать полученный String в другую кодировку (в браузере появлялись знаки вопроса):
Код

String win = rs.getString("fio");
String utf = new String(win.getBytes(),"Cp1251");


Что НЕ пробовал (на выбранные кодировки не обращайте внимания):
Код

String fio = new String(rs.getString("fio").getBytes("Cp1251"),"Cp1251");

Попробую завтра с утра.

Используемый код:

Код

public ArrayList SelectDoctors(Connection con){
        ArrayList array = new ArrayList();
        try{
            String SQL = "select a.fio from sotrudniki a";
            
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(SQL);
            
            while (rs.next()){
                Doctor newDoctor = new Doctor();
                String fio = rs.getString("fio");

                newDoctor.setDoctorData(fio);
                array.add(newDoctor);
            }
            rs.close();
            stmt.close();

        }catch (Exception e){
            e.printStackTrace();
        }
        return array;
    }



При написании кода создавалась тестовая база MsSQL 2000 и он работал корректно. При подключении к рабочей базе - появляется описанная проблема. Какая кодировка стоит на рабочей базе не могу сказать точно, но вроде бы как Cp1251.

Автор: Hidrag 4.9.2009, 10:56
1. Узнать в какой кодировке хранятся данные в БД
2. В какой кодировке выводишь в браузер.

Иногда советуют вместо родного драйвера от МС использовать jTDS драйвер...

Автор: zuzukrukov 4.9.2009, 13:32
Огромное спасибо за помощь. Проблема решена.

Почему такое было:
Сама база хранит записи в кодировке Cp1251, а данные туда запихивались в latin1 (так и не понял зачем. Скорее всего были дефолтные установки).
При выборке данных с помощью метода getString() строка записывалась в кодировке Cp1251 (так как их хранит база).

Почему не сработало конвертирование, которое я указал в предудыщуем посте:
Код

String win = rs.getString("fio");
String utf = new String(win.getBytes(),"Cp1251");

Потому что если в методе getBytes() не указывать кодировку, то никакого преобразования не происходит.

И, наконец, рабочий код:
String fio = new String(rs.getString("fio").getBytes("latin1"),"Cp1251");

В переменную fio записаны данные в правильной кодировке (в данном случае в Cp1251).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)