...

четверг, 21 августа 2014 г.

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?


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий