Russian Qt Forum
Ноябрь 22, 2024, 20:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: win + qDebug + QString + кириллица  (Прочитано 22063 раз)
fland
Гость
« : Апрель 18, 2010, 15:20 »

имеется qt 4.6.2 под виндами. Проект с исходниками в UTF-8.
Вообще говоря нужно выполнить sql запрос с кириллицей. Трабла - кириллицы в нужном виде по получаю.
Для начала мучаю просто QString и qDebug для получения вменяемого вывода там, тогда, думаю, и QString для запросов полечатся.
Что имеется:
Код:
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForTr(codec);
QString queryString = QObject::tr("тест");
qDebug() << QObject::tr("тест");
qDebug() << queryString.toUtf8();
queryString = "тест";
qDebug() << queryString;
qDebug() << QString::fromUtf8("тест");

вывод:

"ЄхёЄ"
"N??╡N?N?"
"N??╡N?N?"
"ЄхёЄ"

как можно вообще полечить эту кодировку??? Поиск по форуму не дал какого-то конечного совета, все советуют все разное и ничего недейственно (з.ы. на гугле не забанен...)

Пробовал и такой вариант:

Код:
    QTextCodec *codec = QTextCodec::codecForName("IBM866");
    QTextCodec::setCodecForTr(codec);
    QString queryString = QObject::tr("тест");
    qDebug() << QObject::tr("тест");
    qDebug() << queryString.toUtf8();
    queryString = "тест";
    qDebug() << queryString;
    qDebug() << QString::fromUtf8("тест");

результат:
"T┬жжT┴T┬"
"a?д??a??a??a?д??a?д??"
"N??╡N?N?"
"ЄхёЄ"

пробовал codecForName cp1251 - тож крякозяблы...

upd интересное кино. Формирую запрос так:
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
queryString = tr("INSERT INTO data (name) VALUES ('Макс');");
qDebug queryString'а выводит крякозяблы, а вот в базу пишется в правильной кодировке (база sqlite - у нее в стандарте utf-8). Знач вроде как в стринге лежит utf-8, чиво ж тогда не хватает консоли?...
« Последнее редактирование: Апрель 18, 2010, 17:49 от fland » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 18, 2010, 18:01 »

Для вывода в консоль:
Код
C++ (Qt)
QTextCodec *consoleCodec = QTextCodec::codecForName("IBM866");
QTextStream error(stderr);
error.stCodec(consoleCodec);// чтобы правильно преобразовать внутреннее представление Qt (UTF-16) к консоли
 
// Если исходник в UTF8
QString queryString = QObject::trUtf8("тест");// чтобы правильно преобразовать символы к внутреннему представлению Qt (UTF-16)
 
error << queryString;
 
Записан

Юра.
fland
Гость
« Ответ #2 : Апрель 18, 2010, 19:06 »

Для вывода в консоль:
Код
C++ (Qt)
QTextCodec *consoleCodec = QTextCodec::codecForName("IBM866");
QTextStream error(stderr);
error.stCodec(consoleCodec);// чтобы правильно преобразовать внутреннее представление Qt (UTF-16) к консоли
 
// Если исходник в UTF8
QString queryString = QObject::trUtf8("тест");// чтобы правильно преобразовать символы к внутреннему представлению Qt (UTF-16)
 
error << queryString;
 
работает. Спасибо. Только вот как qDebug объяснить что он должен юзать consoleCodec - пока не ясно, для него то .setCodec не позовешь Грустный
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Апрель 18, 2010, 20:19 »

>>Только вот как qDebug объяснить что он должен юзать consoleCodec - пока не ясно, для него то .setCodec не позовешь
только переопределив вывод. Смотри тут
Там вместо
fprintf(stderr, "Debug: %s\n", msg);
можешь написать тот код что я привёл, разумеется QTextStream и его настройка нужна будет только в начале функции myMessageOutput
Записан

Юра.
fland
Гость
« Ответ #4 : Апрель 18, 2010, 20:37 »

>>Только вот как qDebug объяснить что он должен юзать consoleCodec - пока не ясно, для него то .setCodec не позовешь
только переопределив вывод. Смотри тут
Там вместо
fprintf(stderr, "Debug: %s\n", msg);
можешь написать тот код что я привёл, разумеется QTextStream и его настройка нужна будет только в начале функции myMessageOutput
спасибо. Такой вот еще вопрос. Ежели через qDebug высыпать что-то - появляется сразу. А ежели QTextStream использовать, то в самой консоли сообщение появляется в конце вызова функции, где и был этот вызов (а может и позже, а может и раньше), но в общем по коду вызов вывода через QTextStream идет до qDebug, а высыпается уже после него? Дело в каких-то приоритетах, али в чем?
Записан
BRE
Гость
« Ответ #5 : Апрель 18, 2010, 20:42 »

Дело в каких-то приоритетах, али в чем?
Думаю дело в буферизации. Почитай про flush в разделе QTextStream.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Апрель 18, 2010, 20:50 »

смотря что используется, по идее stderr без буферизации и, я думаю, QTextCodec(stderr) тоже доллжен быть без буферизации
Записан

Юра.
fland
Гость
« Ответ #7 : Апрель 18, 2010, 20:52 »

Думаю дело в буферизации. Почитай про flush в разделе QTextStream.
в точку. Спасибо
Записан
BRE
Гость
« Ответ #8 : Апрель 18, 2010, 20:53 »

смотря что используется, по идее stderr без буферизации и, я думаю, QTextCodec(stderr) тоже доллжен быть без буферизации
Сам QTextStream с буферизацией.
Записан
SABROG
Гость
« Ответ #9 : Апрель 19, 2010, 17:55 »

Всю ущербность затеи можно понять из этого решения:

Код
C++ (Qt)
#include <QtCore/QtGlobal>
#include <QtCore/QDebug>
#include <QtCore/QTextCodec>
#include <QtCore/QCoreApplication>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
#if defined(Q_WS_WIN)
   if (QLocale::system().country() == QLocale::RussianFederation)
       QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM866"));
#endif
 
#if 1
   qDebug() << QObject::trUtf8("тест");
#else
   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
   QTextCodec::setCodecForTr(QTextCodec::codecForCStrings());
   qDebug() << QObject::tr("тест");
#endif
   // ...
   return a.exec();
}
 
 

Использование текста отличного от английского в исходниках - изначально не верно.
Записан
fland
Гость
« Ответ #10 : Апрель 27, 2010, 19:05 »

Да про русс язык то все верно. Просто не хотелось связываться с переводами и Linguist. Как оказалось зря - вещь удобная и красивая. Переводы - наше все.
И вот вопросик вдогонку. Имеется ubuntu + qt linguist из общей сборки 4.2 + исходники проги в utf-8.
Генерю файлы перевода через lupdate. Загружаю их в лингвист и мне русские символы крякозябликами показываются Грустный. Некритично, конечно (все равно добавил в приложение две локали - ru и en), но все же неудобно - приходиться лезть в creator и смотреть что же там было написано то (каюсь, нужно было сразу писать исходники на англ, а потом просто переводить). Но такой вопрос - а как-то можно вообще объяснить linguist что это utf-8 и что нужно то понимать русс символы? Али не стоит морочить из-за этого голову да и переписать все на англ и сделать норм перевод?
Записан
crossly
Гость
« Ответ #11 : Апрель 28, 2010, 12:47 »

укажите CODECFORTR в *.pro файле...
Записан
fland
Гость
« Ответ #12 : Апрель 28, 2010, 22:03 »

укажите CODECFORTR в *.pro файле...
сказал

CODECFORTR = UTF-8

мне lupdate сказал что "таки ты гонишь у тебя указана ISO-какая-то (не помню уже)". Но сконвертил. Linguist открыл вообещ прикольно. В окошке Строки - все нормально, а в окошке Исходники и формы - кракозяблики... Улыбающийся
Записан
Const_Fi
Гость
« Ответ #13 : Ноябрь 12, 2012, 16:10 »

Выдаёт что-то в таком духе:

Код:
D:/soft/Qt/mkspecs/features/device_config.prf(12): Querying unknown property CRO
SS_COMPILElupdate warning: Codec for tr() 'UTF-8' disagrees with existing file's
 codec 'ISO-8859-1'. Expect trouble.
Updating 'ru.ts'...
    Found 18 source text(s) (0 new and 18 already existing)

В QLinguist русский в коде как был крякозябрами, так и остался. Знаю, что отличный от английского текст в коде -- не комильфо, но осадочек всё равно остался...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.189 секунд. Запросов: 23.