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

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

Страниц: [1] 2 3 ... 6   Вниз
  Печать  
Автор Тема: Вывод русских символов в консоль  (Прочитано 62704 раз)
8Observer8
Гость
« : Февраль 15, 2014, 00:16 »

Привет!

Я много искал, гуглил, пробовал, создавал тему на зарубежном форуме: http://www.qtcentre.org/threads/56384-How-to-write-a-Russian-text-in-console?highlight=

Но так и не смог вывести строку "Привет, Мир!" в консоль.

Что интересно ввод\вывод работает нормально:

Код
C++ (Qt)
#include <QCoreApplication>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString input;
   cin >> input;
   QString russian = QString::fromUtf8(input.toUtf8());
   cout << russian << endl;
   cout.flush();
 
   return a.exec();
}
 

А в следующем примере на экран выводится это: ╧ЁштхЄ, ╠шЁ!

Код
C++ (Qt)
#include <QCoreApplication>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString str = QString::fromUtf8("Привет, Мир!");
   cout << str << endl;
   cout.flush();
 
   return a.exec();
}
 

Прошу помощи! Заранее спасибо!
« Последнее редактирование: Сентябрь 10, 2014, 10:23 от 8Observer8 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 15, 2014, 00:19 »

кодировку своего файла сделай UTF-8
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #2 : Февраль 15, 2014, 00:24 »

У меня по умолчанию она выставлена:

« Последнее редактирование: Февраль 15, 2014, 00:30 от 8Observer8 » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Февраль 15, 2014, 10:01 »

Код
C++ (Qt)
QString string = "Привет мир !";
QTextCodec *codec = QTextCodec::codecForName("CP866");
QByteArray encodedString = codec->fromUnicode(string);
std::cout << encodedString.data();
 
Записан
8Observer8
Гость
« Ответ #4 : Февраль 15, 2014, 11:10 »

Спасибо за ответ! К сожалению, не работает  :'(

Вывод: ?????? м?? !

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет мир !";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
   QByteArray encodedString = codec->fromUnicode(string);
   cout << encodedString.data();
   cout.flush();
 
   return a.exec();
}
 
« Последнее редактирование: Февраль 15, 2014, 11:27 от 8Observer8 » Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #5 : Февраль 15, 2014, 11:19 »

Код:
#include <stdio.h>
...................

    QString message = "Привет мир !";

    QTextStream stream(stdout);

#ifndef QT_NO_TEXTCODEC
    stream.setCodec("csIBM866");
#endif
    //записываем в консоль
    stream << message << endl;
Записан

alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #6 : Февраль 15, 2014, 11:25 »

Спасибо за ответ! К сожалению, не работает  Плачущий
Вывод: НепонимающийНепонимающий м?? !
Вывод: пора бы вам уяснить разницу между QTextStream и basic_ostream<char> .
Я вы вожу в std::cout, и у меня все работает.
А если ты хочешь выводить через QTextStream, то вот:
Код
C++ (Qt)
#include <QCoreApplication>
#include <QTextCodec>
#include <iostream>
 
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QString string = "Привет мир !";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
   QByteArray encodedString = codec->fromUnicode(string);
   std::cout << encodedString.data();
 
   cout.setCodec(codec);
   cout << string;
 
   return 0;//a.exec();
}
 
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Февраль 15, 2014, 11:50 »

В виндовую консоль надо выводить в кодировке IBM 866, в линуксовую - utf-8.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #8 : Февраль 15, 2014, 12:05 »

В виндовую консоль надо выводить в кодировке IBM 866, в линуксовую - utf-8.

в линуксовую - utf-8.  - Не факт!!!
В ASPLinux  - cp1251
В Мандриве - koi8r


Поэтому рекомендую:
Код
C++ (Qt)
#ifndef QT_NO_TEXTCODEC
#if defined(WIN32)
   stream.setCodec("csIBM866");
#else
   stream.setCodec("System");
#endif
#endif
Записан

8Observer8
Гость
« Ответ #9 : Февраль 15, 2014, 12:13 »

Код:
#include <stdio.h>
...................

    QString message = "Привет мир !";

    QTextStream stream(stdout);

#ifndef QT_NO_TEXTCODEC
    stream.setCodec("csIBM866");
#endif
    //записываем в консоль
    stream << message << endl;

Большое спасибо! Работает! Только у меня работает, если добавить ещё: cout.flush(); (прим. с qDebug() - не работает, показано через пример)

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString message = "Привет мир !";
 
#ifndef QT_NO_TEXTCODEC
   cout.setCodec("csIBM866");
#endif
   //записываем в консоль
   cout << message;
   cout.flush();
 
   return a.exec();
}
 

А вот с qDebug() - не работает:

Вывод: "╧ЁштхЄ ьшЁ !"

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString message = "Привет мир !";
 
#ifndef QT_NO_TEXTCODEC
   cout.setCodec("csIBM866");
#endif
   //записываем в консоль
   qDebug() << message;
 
   return a.exec();
}
 

Я вы вожу в std::cout, и у меня все работает

Большое спасибо! Да, через std::cout выводит. А вот через qDebug() - нет:

Вывод: ???? ??? !

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет мир !";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
   QByteArray encodedString = codec->fromUnicode(string);
   qDebug() << encodedString.data();
 
   return a.exec();
}
 

А если ты хочешь выводить через QTextStream, то вот:

Работает! Вот только если я не добавлю cout.flush(), то у меня приложение виснит, а при закрытии падает (первый "Привет, Мир!" он std::cout'ом вывел):



Почему у Вас работает с cout.flush(), а у меня нет?

Вот вариант, который у меня тоже работает (с cout.flush()). А вот с qDebug() это не работает:

Вывод (qDebug): "╧ЁштхЄ ьшЁ !"
Вывод (cout << string;): Привет мир !

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет мир !";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
   QByteArray encodedString = codec->fromUnicode(string);
   std::cout << encodedString.data();
 
   cout.setCodec(codec);
   cout << string;
   cout.flush();
 
   qDebug() << string;
 
   return a.exec();
}
 
Записан
Fat-Zer
Гость
« Ответ #10 : Февраль 15, 2014, 13:16 »

в линуксовую - utf-8.  - Не факт!!!
В ASPLinux  - cp1251
В Мандриве - koi8r
так и хочется ответить былинным лоровским «криокамера потекла?»
ASP давно умер, но под конец жизни ЕМНИП всё же переполз на utf8. мандрива тоже уже лет 7-8 на utf'е...
хотя совет в общем правильный... есть же пока ещё всякие бзди...

Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #11 : Февраль 15, 2014, 16:04 »

так и хочется ответить былинным лоровским «криокамера потекла?»
мандрива тоже уже лет 7-8 на utf'е...


О Господи!   Я Мандриву перепутал с Мандрейк-ом. 
Мандрейк  исдох  тоже очень давно!


Я - эксплуатирующий инженер с прожилкой программиста,
у меня этого гуталина завались! 



Записан

BuRn
Гость
« Ответ #12 : Февраль 15, 2014, 16:28 »

так и хочется ответить былинным лоровским «криокамера потекла?»
мандрива тоже уже лет 7-8 на utf'е...
О Господи!   Я Мандриву перепутал с Мандрейк-ом. 
Мандрейк  исдох  тоже очень давно!
Я - эксплуатирующий инженер с прожилкой программиста,
у меня этого гуталина завались! 
Если память не изменяет, то мандрива появилась в 2005, называлась тогда еще мандрива 2006, а образовалась она как раз таки от мандрейка.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #13 : Февраль 15, 2014, 22:08 »

для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Февраль 15, 2014, 23:53 »

для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));

Безотносительно темы, такой способ вывода строк - это потенциальная уязвимость, см. "format string attack"
Записан
Страниц: [1] 2 3 ... 6   Вверх
  Печать  
 
Перейти в:  


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