Как прочитать и отредактировать записи в базе данных Visual FoxPro (*.dbc, *.dbf) в кодировке Windows-1251?



  • @
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("DRIVER={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=C:/database;Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO;");
    db.open();

    QSqlQuery query;
    query.exec("SELECT * FROM sale");

    //Дальше как только не пробовал, выводиться нечитаемый текст в столбце name char(90)

    QTextCodec * codec = QTextCodec::codecForName("Windows-1251");
    while (query.next())
    {
        QString code = codec->toUnicode(query.value(0).toByteArray());
        QString name = codec->toUnicode(query.value(1).toByteArray());
        QString price = codec->toUnicode(query.value(2).toByteArray());
        qDebug() << code << name << price;
    }
    

    @
    Хочу добиться правильного преобразования хотя бы в консоли, а дальше использовать модель и представление для упрощения работы с базой данных.



  • Возможно в этой ячейке не юникод или драйвер проводит преобразование.
    Выдерни сырые данные какой нибудь строки и попробуй в ручную открыть например в акелпаде. потом можно попробовать скормить ее (кодировку) iconv (по моему он и так тут используется) но все же стоит попробовать меня иконв всегда спасал.



  • Данную проблему решил изменением исходного кода драйвера qsqlodbc.dll. В файле qsql_odbc.cpp заменил все функции fromUtf8() на fromLocal8Bit() и все функции toUtf8() на toLocal8Bit(), а затем откомпилировал и получил новый драйвер qsqlodbc.dll, который теперь работает и отображает русские символы правильно. Отсюда следует, что драйвер Visual FoxPro адекватно работает с Qt только в локальной кодировке. Как переключить Visual FoxPro Driver на работу с Unicode не разбирался.



  • :-)
    bq. Как переключить Visual FoxPro Driver на работу с Unicode не разбирался.

    если мне не изменяет память вообще никак.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.