Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > чтение русского текста из bloba в виджет


Автор: baggins 21.3.2009, 15:32
используется бд firebird. из varchar выводится нормально русский текст, а при выводе текста из блоба на виджет вместо букв выводятся знаки вопросов.

Автор: SABROG 21.3.2009, 15:40
В какой кодировке текст в блоб сохранял в такой она там и лежит.

Автор: baggins 21.3.2009, 15:48
а какая кодировка по умолчанию в qt у QString?

Добавлено через 10 минут и 51 секунду
а все равно не получается, уже явно указал кодировку при вводе и при отображении...выводятся кракозябры

Ввод:
Код

db->insertValAttr(idObject, idattr, txtEdt->toPlainText().toUtf8());


Вывод:
Код

lblValue->setText(db->getValAttrObject(IDObject, idattr).toString().toUtf8());


Функция вставки:
Код

void DBController::insertValAttr(int idimg, int idattr, QString txt)
{
    if (query.prepare("insert into tblattrimage (idimage, idattr, valueattr) values (:idimg, :idattr, :txt)"))
    {
        query.bindValue(0,idimg);
        query.bindValue(1,idattr);
        query.bindValue(2,txt);
        query.exec();
    }
}


Функция получения блоба:
Код

QVariant DBController::getValAttrObject(int idObj, int idattr)
{
    QVariant value;
    if (query.prepare("select valueattr from tblattrimage where (idimage = :idObj) and (idattr = :idattr)"))
    {
        query.bindValue(0, idObj);
        query.bindValue(1, idattr);
        query.exec();
        query.next();
        value = query.record().value(QLatin1String("valueattr"));
    }
    else
    {
        value = 0;
    }
    return value;
}

Автор: SABROG 21.3.2009, 16:02
А где тут блоб вставляется, я не нашел?

Цитата(baggins @  21.3.2009,  15:48 Найти цитируемый пост)
а какая кодировка по умолчанию в qt у QString?

Unicode. Байтовое содержимое Unicode строк и Utf-8 различаются.

Автор: baggins 21.3.2009, 16:08
Цитата

А где тут блоб вставляется, я не нашел?



Код

void DBController::insertValAttr(int idimg, int idattr, QString txt)
{
    if (query.prepare("insert into tblattrimage (idimage, idattr, valueattr) values (:idimg, :idattr, :txt)"))
    {
        query.bindValue(0,idimg);
        query.bindValue(1,idattr);
        query.bindValue(2,txt);
        query.exec();
    }
}


txt записывается в поле valueattr, которое имеет тип блоб

Автор: SABROG 21.3.2009, 20:23
Возможно, конечно, что SQL драйвер преобразует QString в QByteArray, но я почему-то всегда думал, что BLOB'ы так вставляются:

Код

    QByteArray bytes;
    ...
    query.bindValue(2, bytes);


а принимаются так:

Код

    QByteArray fromDB;
    fromDB=query.record().value(QLatin1String("valueattr")).toByteArray();

В общем как обычно проблемы с кодировками. Либо в базе данных настройки стоят неверно, либо кодеки текста настроены не правильно, либо источник текста не стандартный. С firebird не работал, работал с sqlite, проблем небыло никаких. Какой смысл передавать QString в качестве BLOB'a так и не понял...

Автор: baggins 21.3.2009, 20:43
ну мне надо хранить большие объемы текста, а blob как раз для этого и предназначены, кроме всего прочего... а QString я передаю, потому што именно его возвращает функция toPlainText виджета QPlainTextEdit...я знаю што в блоб лучше всего передавать QByteArray, только QString ведь в него не конвертится

Автор: baggins 21.3.2009, 21:07
ну в принципе есть одна зацепка, на нее натолкнул твой пост в этой теме http://forum.vingrad.ru/topic-214051.html , так што пасип smile

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