crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Paradox, Qt и кодировка, проблема с русскоязычным текстом в БД
AD
  опции профиля:
сообщение 14.12.2010, 14:45
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Проблема с русскоязычным текстом при вставке в БД. В приложении сделано так:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));    ///< установка Windows-1251
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());                ///< для внутреннего преобразования
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());                    ///< для функций перевода tr()
в функции main().

Затем... Есть текстовый файл следующего содержания:
Цитата
111000001 Астрономический пункт
112000001 Пункт государственной геодезической сети (ГГС)
113100001 Точка съемочной сети, закрепленная на местности центром
113200001 Точка съемочной сети, не закрепленная на местности центром
114100001 Нивелирный репер, марка
114200002 Нивелирный ход
115100002 ЛИНИИ МЕРИДИАНОВ
115110002 ВЫХОДЫ ЛИНИЙ МЕРИДИАНОВ
116100002 ЛИНИИ ПАРАЛЛЕЛЕЙ
116110002 ВЫХОДЫ ЛИНИЙ ПАРАЛЛЕЛЕЙ
117100002 ВЕРТ.ЛИНИИ ПРЯМОУГОЛЬНОЙ СЕТКИ
117200002 ГОРИЗ.ЛИНИИ ПРЯМОУГОЛЬНОЙ СЕТКИ
117300002 ВЫХОДЫ ВЕРТ.ЛИНИЙ СМЕЖНОЙ ЗОНЫ
117400002 ВЫХОДЫ ГОРИЗ.ЛИНИЙ СМЕЖНОЙ ЗОНЫ
117500002 ВЕРТИК.ЛИН.ПЕРЕСЕЧ.КООРД.ЛИН.
117600002 ГОРИЗ.ЛИН.ПЕРЕСЕЧ.КООРД.ЛИН.

Ну и там намного больше таких описаний.
При чтении файла делаю следующее:
QSqlQuery query(db);
    query.prepare("insert into [AztLayerName]([Id], [Number], [Name]) values(:Id, :Number, :Name)");
    while(!out.atEnd())
    {
        QString line(out.readLine()), left_line(line.section(QChar(' '), 0, 0).simplified()),
                right_line(line.section(QChar(' '), 1, line.size()).simplified());
        query.bindValue(QString(":Id"), id);
        query.bindValue(QString(":Number"), left_line.toInt());
        query.bindValue(QString(":Name"), right_line);
        bool is_ins = query.exec();
        ++id;
    }

Так проблема в том, что в БД вместо строки вставляются знаки вопроса. Где и как изменить кодировку? На форуме перед тем, как задать вопрос - порылся. Ответы есть для MySql! Для Paradox строка set character set latin1 не работет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 14.12.2010, 14:51
Сообщение #2


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Используй QTextStream и устанавливай кодек ему.

Сообщение отредактировал panter_dsd - 14.12.2010, 14:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.12.2010, 14:53
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(panter_dsd @ 14.12.2010, 14:51) *
1. Следи за скобками QString line(out.readLine()),
2. Используй QTextStream и устанавливай кодек ему.

1) Не понял. Что не так?
2) QTextStream я и использую. out - данного типа. Какой именно ему кодек устанавливать надо? После чтения строки в дебаге я вижу русский текст.

Сообщение отредактировал AD - 14.12.2010, 14:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 14.12.2010, 14:56
Сообщение #4


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


1. Да сразу не заметил, что ты определяешь 3 QString. ИМХО, правильнее писать
QString line(out.readLine());
QString left_line(line.section(QChar(' '), 0, 0).simplified());
QString right_line(line.section(QChar(' '), 1, line.size()).simplified());

2.
QTextStream stream (&file);
stream.setCodec ("CP1251");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.12.2010, 15:03
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(panter_dsd @ 14.12.2010, 14:56) *
1. Да сразу не заметил, что ты определяешь 3 QString. ИМХО, правильнее писать
QString line(out.readLine());
QString left_line(line.section(QChar(' '), 0, 0).simplified());
QString right_line(line.section(QChar(' '), 1, line.size()).simplified());

2.
QTextStream stream (&file);
stream.setCodec ("CP1251");

1) Ладно. На счет первого спорить не буду. Считаю, что если можно сделать за 1 шаг, пусть делает за один, чем за три.
2) Так у меня QTextStream итак выводит в русскоязычном варианте. Зачем еще раз определять для него? Попробую конечно, но не думаю, что поможет.

2) Не помогло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 14.12.2010, 15:10
Сообщение #6


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Скорее всего это уже к Кьюту отношения не имеет. Посмотри тут тыц
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.12.2010, 15:33
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(panter_dsd @ 14.12.2010, 15:10) *
Скорее всего это уже к Кьюту отношения не имеет. Посмотри тут тыц

А что именно может помочь? Испробовал несколько вещей. Не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 14.12.2010, 15:40
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


А может записи в самой БД хранятся в другой кодировке?

----
UPD
А сам файл текстовый считывается нормально? В дебаге смотрел на значения?

Сообщение отредактировал Rocky - 14.12.2010, 15:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.12.2010, 16:23
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Rocky @ 14.12.2010, 15:40) *
А может записи в самой БД хранятся в другой кодировке?

Думаю, что это понятно из-за самой проблемы.

Цитата(Rocky @ 14.12.2010, 15:40) *
А сам файл текстовый считывается нормально? В дебаге смотрел на значения?

Уже говорил! :) ;) Нормально считывается и в дебаге видел русский текст.


Решение получилось. Итак:
1) При чтении файла ставлю кодировку Latin1
    query.prepare("insert into AztLayerName(Id, [Number], Name) values(?, ?, ?)");
    while(!out.atEnd())
    {
        QString line(out.readLine()), left_line(line.section(QChar(' '), 0, 0).simplified()),
                right_line(line.section(QChar(' '), 1, line.size()).simplified());
        query.bindValue(0, id);
        query.bindValue(1, left_line.toInt());
        query.bindValue(2, right_line);
        bool is_ins = query.exec();
        ++id;
    }

При чтении из БД с выбранной строчкой выполняю функцию класса QString toLatin1():
return record(index.row()).value("Name").toString().toLatin1();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.12.2024, 18:58