Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Импорт в БД из XML файла. Проблемы с кодировкой 
V
    Опции темы
plica98
Дата 27.3.2012, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Уважаемые Qt-шники, нужна помощь начинающему.

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

Консоль UTF8.

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




Код


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

           qDebug() << name;




Это сообщение отредактировал(а) plica98 - 28.3.2012, 10:25
PM MAIL   Вверх
ashain
Дата 28.3.2012, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 3.7.2011

Репутация: нет
Всего: 1



QApplication::tr() - попробуйте использовать
Либо покажите как xml разбераете
PM MAIL   Вверх
plica98
Дата 29.3.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



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
выводятся 'тараканы'.


Это сообщение отредактировал(а) plica98 - 29.3.2012, 12:27
PM MAIL   Вверх
math64
Дата 29.3.2012, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В ISO-8859-1 русских букв нет. Поправьте кодировку в заголовке xml на правильную.
PM   Вверх
plica98
Дата 29.3.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



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


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


Это сообщение отредактировал(а) plica98 - 29.3.2012, 12:41
PM MAIL   Вверх
plica98
Дата 29.3.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



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

В main() добавил


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


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

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


PM MAIL   Вверх
math64
Дата 29.3.2012, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



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

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

PM   Вверх
plica98
Дата 29.3.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Уважаемые Qt - шники, всем большое спасибо за помощь.

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

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

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


PostgreeSql (на Linux -овой  машине ) показывает кодировку UTF8.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.