Pull to refresh

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

Reading time 2 min
Views 11K
Небольшой хак по преобразованию кодировки 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?
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+6
Comments 8
Comments Comments 8

Articles