MS SQL —(?)—> UTF-8

от автора

Вариант решения задачи про преобразованию кодировки windows-1251 в БД к кодировке utf-8 для клиентской программы на QT5.

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

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

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

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher

В своей программе я напрямую не отображаю результат 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");  //беру содержимое поля как массив байт и преобразовываю его к UTF-8. дальше его можно использовать в QT ... = codec->toUnicode(queryl->value( 0 ).toByteArray()); 

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

А может кто-то знает строку подключения для UTF-8?

ссылка на оригинал статьи http://habrahabr.ru/post/234089/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *