Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Импорт в БД из XML файла.


Автор: plica98 27.3.2012, 11:40
Уважаемые Qt-шники, нужна помощь начинающему.

В xml -файле кодировка ISO-8859-1. Разбираю xml файл пишу в БД и вывожу на консоль.
Как мне перекодировать при записи в БД PostgreeSql,  
чтобы на консоль выводились русский текст ?

Консоль UTF8.

Заранее благодарю за помощь.




Код


            strcpy(name,textChild.nodeValue().toAscii().data());   // Кодировка  !!!!!!!!!

           qDebug() << name;



Автор: ashain 28.3.2012, 22:58
QApplication::tr() - попробуйте использовать
Либо покажите как xml разбераете

Автор: plica98 29.3.2012, 11:49
XML -файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<opml version="1.0">
<user>0
    <name>Петров</name>
</user>
<user>1
    <name>Иванов</name>
</user>
</opml>





Код

/* ======================================================================
**  main.cpp
** ======================================================================
*/

#include <QtGui>
#include <QtSql>
#include <QtXml>

char zapr[1024];
QSqlQuery *query;


        int num;    //Номер
        char *name;    //ИМЯ

void buildTree( const QDomElement &parentElement, int lavel, QSqlQuery *query)
{
        QDomNode node = parentElement.firstChild();
        while ( !node.isNull() ) {

                        if(!strcasecmp("#text",node.nodeName().toAscii().data())) {
                                QDomText textChild = node.toText();
                                if ( !textChild.isNull() ) {
                                        switch(lavel) {
                                        case 0:
                                                        num=textChild.nodeValue().toInt();
                                                        break;
                                        case 1:
                                                        strcpy(name,textChild.nodeValue().toAscii().data());
                                                        qDebug() << name;                                               //печать имени ("тараканы")
                                                        break;
                                                }
                                }
                        goto m1;
                        }
                        if(!strcasecmp("name",node.nodeName().toAscii().data())) {
                                buildTree( node.toElement(),lavel+1,query);
                                goto m1;
                        }
m1:
                node = node.nextSibling();
    }
}


//------------------------------------------------------------

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setDatabaseName("mydb");
    db.setUserName("mmm");
    db.setHostName("localhost");
    db.setPassword("***");

    if (!db.open()) { qDebug() << "Не могу открыть БД  mydbb:" << db.lastError();
        exit(-1);
                 }
    else    { qDebug() << "База данных mydb открыта";
                 };

    query = new QSqlQuery(db) ;

        QDomDocument doc( "mydocument" );
        QFile f( "student" );
        if ( !f.open( QIODevice::ReadOnly ) ) {
                perror( "Ошибка открытия файла student");
                exit(-1);
        }
        if ( !doc.setContent( &f ) ) {
                f.close();
                perror( "Ошибка структуры файла student");
                exit(-1);
        }
        f.close();
//        f.~QFile();
        QDomElement docElem = doc.documentElement();            // Возвращает корневой элемент
        QDomNode n = docElem.firstChild();
        while( !n.isNull() ) {
                QDomElement e = n.toElement();
                if( !e.isNull() ) { // узел действительно является элементом.

                        buildTree(e,0,query);

                bzero(&zapr, sizeof(zapr));
                sprintf(zapr, "INSERT INTO TAB1 VALUES (%d, '%s');",num,name);    // Формирование запроса
                if (!query->exec(zapr))                                                                     // Вставить запись в БД
                    {
                        qDebug() << "Запись не вставлена в таблицу TAB1"  << db.lastError();
                        exit(-1);
                    }
                else    { qDebug() << "Запись добавлена в таблицу ТAB1";
                         };
                }
                n = n.nextSibling();
        }

    QTableView     view;
    QSqlTableModel model;

    model.setTable("TAB1");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);

    view.setModel(&model);


    view.show();

    return app.exec();
}






В БД записи вставляются нормально, только при просмотре через    psql
выводятся 'тараканы'.

Автор: math64 29.3.2012, 12:26
В ISO-8859-1 русских букв нет. Поправьте кодировку в заголовке xml на правильную.

Автор: plica98 29.3.2012, 12:37
>>>В ISO-8859-1 русских букв нет. Поправьте кодировку в 
>>>заголовке xml на правильную.


В исходном файле была именно такая кодировка.
Но я перепробовал разные. Результат тот же.

Автор: plica98 29.3.2012, 13:24
Уважаемые, коллеги.
Вопрос решил таким способом:

В main() добавил


    QTextCodec* codec = QTextCodec::codecForName("UTF8");
    QTextCodec::setCodecForCStrings(codec);


Открыл XML-файл редактором gedit и сохранил его в кодировке KOI8-R.

Но разобраться с кодировкой хотелось бы до конца.


Автор: math64 29.3.2012, 13:50
Цитата(plica98 @  29.3.2012,  12:37 Найти цитируемый пост)
В исходном файле была именно такая кодировка.
Но я перепробовал разные. Результат тот же.

В исходном файле какая-то другая кодировка. Открой в редакторе, позволяющем выбирать кодировку и убедишься.
PostgreSql у тебя скорее всего настроен на эту кодировку по умолчанию, поэтому у тебя она и оказывается "правильной".

Автор: plica98 29.3.2012, 14:18
Уважаемые Qt - шники, всем большое спасибо за помощь.

Заголовок исходного XML-файла:

<?xml version="1.0" encoding="ISO-8859-1"?>
<opml version="1.0">
...............
...............

Я менял кодировку именно в заголовке, а сам файл оставался тем же.
В Винде открыл файл редактором AkelPad.
Он показал кодировку 1251(ANSI - кириллица).


PostgreeSql (на Linux -овой  машине ) показывает кодировку UTF8.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)