数据库是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下的注册表中设置此值会立即解决问题...
答案 0 :(得分:0)
在查询结果中cp1251编码为cp866,修改文本。 Setup DataCodePage = ANSI“DSN ODBC被忽略。所以你需要在注册表\SOFTWARE\Microsoft\Jet\4.0\Engines\xBase
中设置ANSI的值。