Название: Непонятки с кодировкой Отправлено: kadr от Декабрь 11, 2009, 09:39 Что то непонятное происходит с кодировкой!
#include <QtCore/QCoreApplication> #include "QFile" #include "QDir" #include "QDate" #include "QTextCodec" #include "QDebug" #include "QSqlDatabase" #include "QSqlQuery" #include "QSqlError" #include "QVariant" int main() { QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251")); // Подключение к Базе Данных--------------------------------------------------------------------------------------------------- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("192.168.1.223"); db.setDatabaseName("farm_price"); db.setUserName("1c"); db.setPassword("1c"); db.open(); if (!db.isOpen()) { qDebug() << "Bd is not open" << db.lastError().text() ; } QDir dir; QString STR,str,tovar,r,apteka,path,code,line_date; QStringList st; QSqlQuery q; QFileInfo inf; QDate date; QTextStream cas(stdin);// Ввод данных в консоль int i,j; double nac_ost,kon_ost,prih,real; //---------------------------------------------------------------------------------------------------------------------------- qDebug() << "Enter date in format dd.MM.yyyy"; cas >> line_date; STR.clear(); dir.setCurrent("\\\\192.168.1.223\\transfer\\real"); i = 0; STR = QString("DELETE FROM real WHERE date = '%1'") .arg(date.currentDate().toString("yyyy-MM-dd")); q.exec(STR); STR.clear(); q.clear(); if (dir.entryList(QStringList() << "*.txt").count() > 0) { while (i != dir.entryList(QStringList() << "*.txt").count()) { path ="\\\\192.168.1.223\\transfer\\real\\"+dir.entryList(QStringList() << "*.txt").value(i); inf = path.trimmed(); if (inf.lastModified().toString("dd.MM.yyyy") == line_date) { QFile file(dir.entryList(QStringList() << "*.txt").value(i)); qDebug() <<"First"<< dir.entryList(QStringList() << "*.txt").value(i); r = dir.entryList(QStringList() << "*.txt").value(i); r.left(3); code.append(r+","); r.clear(); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() <<file.errorString(); } str.clear(); st.clear(); j = 0; apteka = dir.entryList(QStringList() << "*.txt").value(i);// Занесение номера аптеки в переменную while (!file.atEnd()) { if (j < 4) { str = file.readLine().trimmed(); j++; } else { str = file.readLine().trimmed(); st = str.split("\t"); tovar = st.value(1); // Название и серия товараw tovar.remove(tovar.indexOf("'"),1); //Удаление символа ' из строк если есть такие tovar.replace(tovar.indexOf("\""),1,""); //Замена символа " на пробел qDebug() << tovar.trimmed(); r.clear(); r = st.value(2); nac_ost = r.toDouble(); r.clear(); r = st.value(3); real = r.toDouble(); r.clear(); r = st.value(4); prih = r.toDouble(); r.clear(); r = st.value(5); kon_ost = r.toDouble(); // Конечный остаток q.clear(); STR = QString("INSERT INTO real (apteka,name,nac_ost,real,prih,kon_ost,date) VALUES ('%1','%2',%3,%4,%5,%6,'%7')") .arg(apteka.left(3)) .arg(tovar) .arg(nac_ost) .arg(real) .arg(prih) .arg(kon_ost) .arg(date.currentDate().toString("yyyy-MM-dd")); q.exec(STR); //qDebug() <<q.lastError().text(); j++; } } i++; file.close(); } else { i++; } } } //----------------------------------------------------------------------------------------------------------------------------- // Формирование отчета и сохранение его в \\192.168.1.223\Transfer\otchet\otchet_all.csv qDebug() << "Making otchet_real_all.csv"; STR.clear(); q.clear(); QFile file("\\\\192.168.1.223\\Transfer\\otchet\\otchet_real_all.csv"); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); STR = QString("SELECT name, SUM(nac_ost), SUM(real), SUM(prih), SUM(kon_ost) FROM real WHERE date = '%1' GROUP BY name") .arg(date.currentDate().toString("yyyy-MM-dd")); q.exec(STR); out << "Apteki: "+code+"\n"; out <<"Tovars"; out <<";"; out <<"Nachal_Ostatok"; out <<";"; out <<"Realis"; out <<";"; out <<"Prihod"; out <<";"; out <<"Konich_Ostatok"; out <<"\n"; while (q.next()) { out << q.value(0).toString(); out << ";"; out << q.value(1).toString(); out << ";"; out << q.value(2).toString(); out << ";"; out << q.value(3).toString(); out << ";"; out << q.value(4).toString(); out << ";"; out << q.value(5).toString(); out << "\n"; } file.close(); return 0; } Вот что на выходе: "▌эЄхЁюёухы№ ухы№ ф/яЁшуюЄ.ёєёяхэчшш яръхЄ 225у/ ╬╬╬ ╤шыьр ╥═╩ / ╨юёёш" "▌Ётр °хЁёЄшёЄр ЄЁртр 50у / ╚трэ ╫рщ ╟└╬ ╨юёёш" "▌Ёхёяры Єрс.я/ю 80ьу ╣30 / ╤хЁт№х / ╘ЁрэЎш" "▌ЁшэшЄ Єрс.0.01 N50 / ╥рЄїшьЇрЁьяЁхярЁрЄ√ ╩╧╒╘╬/ ╨юёёш" "▌ЁшЄЁюьшЎшэ Єрс.я/ю 0,1 ╣10 / ╤шэЄхч └╩╬ ╬└╬ у.╩єЁурэ ╨юёёш / ╨юёёш" "▌ЁшЄЁюьшЎшэютр ьрч№ уырчэр 10000┼─ 10у / ╥рЄїшьЇрЁьяЁхярЁрЄ√ ╩╧╒╘╬ / ╨юёёш" "▌ёяхЁры№ Єрс. 500ьу ╣20 ╤юЇрЁшьхъё ╚эфєёЄЁшр ╩шьшър ш ╘рЁьрЎхтЄшър ╦фр ╧юЁЄєу Название: Re: Не понятки с кодировкой! Отправлено: Aleksey_Zh от Декабрь 11, 2009, 11:51 Очень похоже на то, что у тебя сама база в другой кодировке (не Windows-1251). Попробуй сменить кодировку базы.
Название: Re: Не понятки с кодировкой! Отправлено: kadr от Декабрь 11, 2009, 12:40 Очень похоже на то, что у тебя сама база в другой кодировке (не Windows-1251). Попробуй сменить кодировку базы. нет база в кодировке cp1251_general_ci, но дело в том что он выдает такую бяку, до добавления в базу, то есть при чтении из файла, именно по этому и не добавляется в базу! Название: Re: Непонятки с кодировкой Отправлено: kadr от Декабрь 14, 2009, 10:45 Вот вывод lastError():
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'real (apteka,name,nac_ost,real,prih,kon_ost,date) VALUES ('151','?????????░ ???░' at line 1 QMYSQL: Unable to execute query" Название: Re: Непонятки с кодировкой Отправлено: lit-uriy от Декабрь 14, 2009, 11:10 kadr, надо в тэг code оборачивать, а то так и будем весёлые кртинки разглядывать
Название: Re: Непонятки с кодировкой Отправлено: voronElf от Декабрь 15, 2009, 11:28 Для начала стоит стоит проверить что в таблице MySql тексты не кракозябрами лежат (а то был случай ;) )
а потом насколько я понимаю, кодеки ты создал, но их еще применить надо, так что при выборке из базы вместо out << q.value(0).toString(); пиши что-то в стиле out << tr(q.value(0).toByteArray().data()); либо сразу ByteArray в файл: out << q.value(0).toByteArray(); |