Qt 5.x, ODBC (dBase, dbf), Windows, кодировки

База данных представляет собой набор dbf-файлов в кодовой странице Windows-1251 (1C 7.7, если вам нужно знать). Как я могу получить строку UTF-8 в результате? Каким-то образом удается увидеть нужный текст только в консоли, только с локалью: IBM 866

Пример кода:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=/path/to/database");
db.open(); // Ok
QSqlQuery query = QSqlQuery("select descr from SC84", db);
query.next(); // Ok

// "╩єчютэюх цхыхчю"qDebug(query.value(0).toByteArray().data());

// if setup locale ...
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));

// "Кузовное железо" (i was looking for this russian words!)
qDebug(query.value(0).toByteArray().data());

// "╩єчютэюх цхыхчю"QMessageBox::information(this, "test as is", query.value(0).toString());

// "тХй╤Ф╤З╤О╤В╤Н╤О╤Е ╤Ж╤Е╤Л╤Е╤З╤О" — what was wrong?
QMessageBox::information(this, "test from DOS-866",
QTextCodec::codecForName("IBM 866")->toUnicode(query.value(0).toByteArray().data()));

Я понимаю, что где-то есть неявное преобразование. Но не могу найти решение!

PS Вопрос закрыт. Трудно было догадаться, что причина перекодировки «cp1251 как cp866». Проблема в том, что игнорируются настройки соединения в строке ODBC DSN. Попытки решить с помощью параметра «DataCodePage = ANSI» не увенчались успехом, параметр был отклонен. Но установка этого значения в реестре в \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ xBase немедленно решила проблему …

0

Решение

В результатах запроса cp1251 закодирован как cp866, искажающий текст. Setup DataCodePage = ANSI «DSN ODBC игнорируется. Поэтому необходимо указать значение ANSI в реестре \SOFTWARE\Microsoft\Jet\4.0\Engines\xBase,

0

Другие решения


По вопросам рекламы [email protected]