Qt 5.x,ODBC(dBase,dbf),Windows,编码

时间:2014-05-22 07:28:52

标签: c++ qt encoding odbc dbf

数据库是Windows-1251代码页中的一组dbf文件(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下的注册表中设置此值会立即解决问题...

1 个答案:

答案 0 :(得分:0)

在查询结果中cp1251编码为cp866,修改文本。 Setup DataCodePage = ANSI“DSN ODBC被忽略。所以你需要在注册表\SOFTWARE\Microsoft\Jet\4.0\Engines\xBase中设置ANSI的值。