LINUX.ORG.RU

Qt:: кодировка при работе с Microsoft SQL

 


0

1

Всем доброго времени суток. Такая тема уже поднималась,

https://www.linux.org.ru/forum/development/3591060

но ответа, как это сделать в Qt я не нашел.

Ситуация аналогичная: делаю запрос к базе получаю ответ, преобразовываю в стринг, вместо этого вижу что даже байты не приходят правильно, хотя цифры нормально читаются. Перебрал

    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QTextCodec::setCodecForLocale(codec);

Пробовал «UTF-8», пробовал менять драйвер на «SQL Server Native Client 10.0» (сейчас «SQL Server»), пробовал преобразования из QByteArray, но дело в том, что мне уже приходят битые байты,

в дебаге:

'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd

то есть дело в кодировке кириллицы с самого подключения.

Смотрел здесь,

https://habr.com/post/234089/

не помогло. Подскажите, пожалуйста, кто имел с этим делом, как решили этот вопрос?


QTextCodec::setCodecForLocale(codec);

Не надо так делать. Используйте QTextCodec::toUnicode() для нужных строк.

Кодировка самой базы какая?

RazrFalcon ★★★★★
()

только вродe cp1251, а может так:

QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
или так
 QTextCodec::setCodecForLocale(QTextCodec::codecForName("System"));
или так
 QTextCodec::setCodecForLocale(QTextCodec::codecForName("cp1251"));

Silerus ★★★★
()
Ответ на: комментарий от Silerus

осталось все то же самое: сами байты кривые

Tumyq
() автор топика
Ответ на: комментарий от RazrFalcon

Да гружу через query

  query->prepare("exec хранимая процедура :параметр1, :параметр2, :параметр3");

  query->bindValue(":параметр1", SessionKey);
  query->bindValue(":параметр2", InQueryKey.isNull() ? QVariant() : InQueryKey);
  query->bindValue(":параметр3", 5);

        query->exec();
        if (query->next())
        {
            do
            {
                my_struct.nom_ID = query->value(0).toInt();
                my_struct.nom_name = query->value(1).toString();
                

                list_my_struct << my_struct;
            }
            while(query->next());
        }

Tumyq
() автор топика
Ответ на: комментарий от RazrFalcon

пардон, не дописал

value(0) = 12

а про value(1), результат я выводил в самом вопросе

'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd

У меня получается строка по количеству символов совпадающая с оригиналом и даже пробелы определяются, но вместо кода символов приходят одинаковые обрезки «65533»

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

1. Зачем вы создаёте qsqlquery в куче?

2. Что за извращения с do..while? Достаточно:

while (query->next()) {
    my_struct.nom_ID = query->value(0).toInt();
    my_struct.nom_name = query->value(1).toString();
                
    list_my_struct << my_struct;
}

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

1. Не просто в куче, query объявлен глобально и получает в конструктор настройки подключения к базе. Не помню, но где-то из других методов что-то не срабатывало с query.

2. do..while используется, потому что пустой QList будет ругаться, если ответ от базы пустой. НО это не суть вопроса

Ответ такой

QVariant(QString, "???????? ??????????")

Tumyq
() автор топика
Ответ на: комментарий от Tumyq

раз и навсегда

Не использовать мастдай и не unicode.

RazrFalcon ★★★★★
()

А что, маздайный сикель не умеет в кодировку подключения отличную от 1251?

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.