Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Paradox, Qt и кодировка
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
AD
Проблема с русскоязычным текстом при вставке в БД. В приложении сделано так:
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
Используй QTextStream и устанавливай кодек ему.
AD
Цитата(panter_dsd @ 14.12.2010, 14:51) *
1. Следи за скобками QString line(out.readLine()),
2. Используй QTextStream и устанавливай кодек ему.

1) Не понял. Что не так?
2) QTextStream я и использую. out - данного типа. Какой именно ему кодек устанавливать надо? После чтения строки в дебаге я вижу русский текст.
panter_dsd
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
Цитата(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
Скорее всего это уже к Кьюту отношения не имеет. Посмотри тут тыц
AD
Цитата(panter_dsd @ 14.12.2010, 15:10) *
Скорее всего это уже к Кьюту отношения не имеет. Посмотри тут тыц

А что именно может помочь? Испробовал несколько вещей. Не помогает.
Rocky
А может записи в самой БД хранятся в другой кодировке?

----
UPD
А сам файл текстовый считывается нормально? В дебаге смотрел на значения?
AD
Цитата(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();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2022 IPS, Inc.