MS SQL (Win1251) –(?)–> Qt (Unicode)

в 21:31, , рубрики: mssql, qt, qt4, qt5, Unicode, utf-8

Небольшой хак по преобразованию кодировки windows-1251 в MSSQL в Unicode для Qt5.

Есть еще системы, которые используют mssql в кодировке win. К одной такой системе я написал расширение на Qt4 и проблему с русскими буквами решил просто: сменой кодировки

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

Время идет и я по возможности перевожу свои проекты на Qt5. Однако, там команды смены кодеков убрали. Все должно быть в Unicode, что правильно. Да и решение работало не всегда и не на каждой версии ОС win.

В своей программе я напрямую не отображаю результат SQL запроса в модель, поэтому проблему решил пока так:

//подключение к бд
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setUserName("<username>");
db.setPassword("<userpass>");
db.setDatabaseName("DRIVER={SQL Server};Server=<servername>;Database=<databasename>;Regional=Yes");

//скорректировал SQL-запрос, в части полей с русскими буквами
query->exec( "select cast(<fieldname> as varbinary) from <tablename>");

//кодек для преобразования
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");

//беру содержимое поля как массив байт и преобразовываю его к Unicode. Дальше его можно использовать в Qt
... = codec->toUnicode(queryl->value( 0 ).toByteArray());

Интересно, что если поле не преобразовывать к varbinary, то метод .toByteArray() выдаст уже испорченные данные.

А может кто-то знает строку подключения для данных в Unicode?

Автор: UA3MQJ

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js