Небольшой хак по преобразованию кодировки 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