Russian Qt Forum

Qt => Общие вопросы => Тема начата: 8Observer8 от Февраль 15, 2014, 00:16



Название: Вывод русских символов в консоль
Отправлено: 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();
}
 

Прошу помощи! Заранее спасибо!


Название: Re: Вывод русских символов в консоль
Отправлено: kambala от Февраль 15, 2014, 00:19
кодировку своего файла сделай UTF-8


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 15, 2014, 00:24
У меня по умолчанию она выставлена:

(http://i7.pixs.ru/storage/3/4/5/127png_2590909_10879345.png)


Название: Re: Вывод русских символов в консоль
Отправлено: alex312 от Февраль 15, 2014, 10:01
Код
C++ (Qt)
QString string = "Привет мир !";
QTextCodec *codec = QTextCodec::codecForName("CP866");
QByteArray encodedString = codec->fromUnicode(string);
std::cout << encodedString.data();
 


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 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();
}
 


Название: Re: Вывод русских символов в консоль
Отправлено: lesav от Февраль 15, 2014, 11:19
Код:
#include <stdio.h>
...................

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

    QTextStream stream(stdout);

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


Название: Re: Вывод русских символов в консоль
Отправлено: alex312 от Февраль 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();
}
 


Название: Re: Вывод русских символов в консоль
Отправлено: sergek от Февраль 15, 2014, 11:50
В виндовую консоль надо выводить в кодировке IBM 866, в линуксовую - utf-8.


Название: Re: Вывод русских символов в консоль
Отправлено: lesav от Февраль 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


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 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'ом вывел):

(http://i6.pixs.ru/storage/3/7/0/128png_5350645_10882370.png)

Почему у Вас работает с 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();
}
 


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



Название: Re: Вывод русских символов в консоль
Отправлено: lesav от Февраль 15, 2014, 16:04
так и хочется ответить былинным лоровским «криокамера потекла?»
мандрива тоже уже лет 7-8 на utf'е...


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


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





Название: Re: Вывод русских символов в консоль
Отправлено: BuRn от Февраль 15, 2014, 16:28
так и хочется ответить былинным лоровским «криокамера потекла?»
мандрива тоже уже лет 7-8 на utf'е...
О Господи!   Я Мандриву перепутал с Мандрейк-ом. 
Мандрейк  исдох  тоже очень давно!
Я - эксплуатирующий инженер с прожилкой программиста,
у меня этого гуталина завались! 
Если память не изменяет, то мандрива появилась в 2005, называлась тогда еще мандрива 2006, а образовалась она как раз таки от мандрейка.


Название: Re: Вывод русских символов в консоль
Отправлено: Fregloin от Февраль 15, 2014, 22:08
для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));


Название: Re: Вывод русских символов в консоль
Отправлено: Alex Custov от Февраль 15, 2014, 23:53
для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));

Безотносительно темы, такой способ вывода строк - это потенциальная уязвимость, см. "format string attack"


Название: Re: Вывод русских символов в консоль
Отправлено: Fregloin от Февраль 16, 2014, 11:36
я лишь показал один из способов, использовать его или нет, это решать ТС


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 16, 2014, 14:03
для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));

Спасибо за ответ! Но у меня не работает:

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

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет мир !";
   qDebug() << qPrintable(string.toUtf8());
 
   return a.exec();
}
 

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

Безотносительно темы, такой способ вывода строк - это потенциальная уязвимость, см. "format string attack"

Спасибо за ответ! Я запомню: может пригодится. В хакерских атаках ничего не понимаю. Я слышал, что есть такая популярная среди хакеров методика взлома - переполнение буфера. Здесь, видимо, это имелось ввиду.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 17, 2014, 10:49
Так как же всё таки русский текст выводить с помощью qDebug()?


Название: Re: Вывод русских символов в консоль
Отправлено: alex312 от Февраль 17, 2014, 11:13
http://qt-project.org/doc/qt-5/qtextcodec.html#setCodecForLocale


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 17, 2014, 11:30
http://qt-project.org/doc/qt-5/qtextcodec.html#setCodecForLocale

Спасибо огромное! Как же всё таки приятно иметь дело с профи  :)

Вывод:
Цитировать
std::cout = Привет мир!
TextStream = Привет мир!
qDebug() =  "Привет мир!"
Enter a text: Привет
From a console = Привет

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
#include <iostream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет, Мир!";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
 
   // std::cout
   QByteArray encodedString = codec->fromUnicode(string);
   std::cout << "std::cout = " << encodedString.data() << std::endl;
 
   // TextStream
   cout.setCodec(codec);
   cout << "TextStream = " << string << "\n";
   cout.flush();
 
   // qDebug
   QTextCodec::setCodecForLocale(codec);
   qDebug() << "qDebug() = " <<  string;
 
   // Console r/w
   cout << "Enter a text: ";
   cout.flush();
   cin.setCodec(codec);
   QString inputStr;
   // Read data from a console
   cin >> inputStr;
   cout << "From a console = " << inputStr << endl;
   cout.flush();
 
   return a.exec();
}
 


Название: Re: Вывод русских символов в консоль
Отправлено: kambala от Февраль 17, 2014, 14:51
кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Февраль 17, 2014, 15:07
кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде

В идеале - да :)


Название: Re: Вывод русских символов в консоль
Отправлено: LisandreL от Февраль 17, 2014, 22:40
кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде
Ну не используете вы кириллицу в коде, а приходит она из транслейта. Вопроса кодировки консоли это же никак не меняет.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Июнь 23, 2014, 12:07
Код
C++ (Qt)
QString string = "Привет мир !";
QTextCodec *codec = QTextCodec::codecForName("CP866");
QByteArray encodedString = codec->fromUnicode(string);
std::cout << encodedString.data();
 

Посмотрите, пожалуйста, почему у меня такой вывод: ЏаЁўҐв!

Код
C++ (Qt)
#ifndef SHOWER_H
#define SHOWER_H
 
#include <iostream>
 
#include <QObject>
#include <QString>
#include <QTextCodec>
#include <QByteArray>
 
class Shower : public QObject
{
   Q_OBJECT
 
public slots:
   void show( QString *content )
   {
       QTextCodec *codec = QTextCodec::codecForName("CP866");
       QByteArray encodedString = codec->fromUnicode( *content );
       std::cout << encodedString.data( ) << std::endl;
   }
};
 
#endif // SHOWER_H
 


Название: Re: Вывод русских символов в консоль
Отправлено: VanDerSam от Июнь 23, 2014, 13:22
Здравствуйте.
Посмотрите под отладчиком содержимое строки content. Если там "ерунда", то надо смотреть, каким способом устанавливаются данные в объект типа QString. Возможно для конструктора преобразования из const char * не установлен кодек.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Июнь 23, 2014, 15:21
Там не ерунда:
(http://i7.pixs.ru/storage/1/4/7/227png_2155278_12678147.png)


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 02, 2014, 17:34
Решение найдено! С помощью std::cout выводится так:
Код
C++ (Qt)
#include <iostream>
#include <QTextCodec>
#include <QObject>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   std::cout << STR( QObject::tr( "Привет, Мир!" ) );
}
 


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 02, 2014, 18:37
Решение найдено!
Нет, не найдено.
На машине с локалью, отличающейся от машины где собиралась программа, будут крякозябры.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 10:56
Решение найдено!
Нет, не найдено.
На машине с локалью, отличающейся от машины где собиралась программа, будут крякозябры.
А как правильно, тогда? :D


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 19, 2014, 11:29
А как правильно, тогда? :D
Нужно использовать кодек той кодировки, в которой выполнен исходный код программы.


Название: Re: Вывод русских символов в консоль
Отправлено: Bepec от Сентябрь 19, 2014, 11:30
Использовать только английский :)


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 11:40
Нужно использовать кодек той кодировки, в которой выполнен исходный код программы.
Можно чуть подробнее? Вот это сочетание непонятно: "кодек кодировки исходного кода программы". Как узнать какой у меня?

Использовать только английский :)
В моём случае не подходит, так как я планирую работать с русскими заказчиками. Пока язык не позволяет.


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 19, 2014, 11:44
Как узнать какой у меня?
Хороший вопрос. :)
В вендовом GUI используется CP1251, в вендовой консоле CP866, креатор использует по дефолту UTF-8.
Как проверить... загрузите исходник и креатор и меняйте кодировки, если русский текст читается - значит оно. :)


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 11:52
загрузите исходник и креатор и меняйте кодировки, если русский текст читается - значит оно.
Я нашёл, где менять: "Edit" -> "Select Encoding" У меня там UTF-8 Русский отображается нормально. На что поменять?


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 19, 2014, 12:02
Я нашёл, где менять: "Edit" -> "Select Encoding" У меня там UTF-8 Русский отображается нормально. На что поменять?

Не надо ни на что менять. Используйте вместо tr -> trUtf8, а для вывода в консоль свой дефайн STR.


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 19, 2014, 12:09
Используй английский, а потом переводи лингвистом.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 13:40
Используй английский, а потом переводи лингвистом.
Сейчас выход нашёл такой: не пишу консольных приложений. Свои проекты ( которые "для души") пишу параллельно на английском и русском, то есть создаю два прокта в двух папках: "RussianVersion" и "EnglishVersion". Проблема с русским языком таким образом решается, но неудобно править два проекта параллельно.

Используйте вместо tr -> trUtf8, а для вывода в консоль свой дефайн STR.
У меня почему-то и версия c tr перестала работать :(

(http://i.pixs.ru/storage/8/8/0/360png_9529666_13896880.png)

Код
C++ (Qt)
#include <iostream>
#include <QTextCodec>
#include <QObject>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   std::cout << STR( QObject::tr( "Привет, Мир!" ) );
}
 


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 19, 2014, 13:56
 :o прости что ты делаешь?? две версии пишешь??? ты извращенец

насчет лингвиста для консоли ошибся, извиняюсь ::)

Тогда чувствую самый человеческий вариант - это использовать лингвиста и для вывода в консоль принудительно назначать консольный кодек.


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 19, 2014, 14:06
Так вы проверьте какой кодек возвращает codecForLocale? Думаю это не cp866.
Используйте для консоли именноэтот кодек.


Название: Re: Вывод русских символов в консоль
Отправлено: vizir.vs от Сентябрь 19, 2014, 15:15
у разных linux возможны разные кодировки консоли, у винды своя кодировка консоли. Тут надо проверять какая система и выставлять соответствующую кодировку. Я делал так, на этапе компиляции проверялось что за система, и делались соответствующие выводы. По хорошему при запуске программы, она должна определить какая кодировка у консоли и выводить в ней.


Название: Re: Вывод русских символов в консоль
Отправлено: Old от Сентябрь 19, 2014, 15:23
В венде codecForLocale скорее всего возвращает кодек CP1251, вместо необходимой CP866.


Название: Re: Вывод русских символов в консоль
Отправлено: Bepec от Сентябрь 19, 2014, 15:38
Ага :D


Название: Re: Вывод русских символов в консоль
Отправлено: vizir.vs от Сентябрь 19, 2014, 15:51
В венде codecForLocale скорее всего возвращает кодек CP1251, вместо необходимой CP866.
Локаль и кодировка консоли немного разные вещи. Вообще, текущую кодировку в винде можно глянуть командой chcp. Как это сделать из под Qt хз, я этим вопросом не занимался. Теоретически, кодировка консоли может быть изменена. + возможны варианты когда установлена такая кодировка, которая не поддерживает русский язык.

Update:
в доках написано:

QTextCodec * QTextCodec::codecForLocale () [static]

Returns a pointer to the codec most suitable for this locale.
On Windows, the codec will be based on a system locale. On Unix systems, starting with Qt 4.2, the codec will be using the iconv library. Note that in both cases the codec's name will be "System".

т.е. Qt видит что русская локаль и выставляет кодек CP1251.


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 19, 2014, 15:56
ахахаха
UINT WINAPI GetConsoleCP(void);
BOOL WINAPI SetConsoleCP(_In_  UINT wCodePageID);


Название: Re: Вывод русских символов в консоль
Отправлено: vizir.vs от Сентябрь 19, 2014, 16:05
ахахаха
UINT WINAPI GetConsoleCP(void);
BOOL WINAPI SetConsoleCP(_In_  UINT wCodePageID);

Только надо еще знать таблицу соответствия числа и кодировки (http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd317756(v=vs.85).aspx).


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 17:47
Как вывести название кодировки (или кодека) я нашёл:

Код
C++ (Qt)
 
#include <iostream>
#include <QTextCodec>
#include <QObject>
#include <QDebug>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   qDebug() << QTextCodec::codecForLocale()->name();
   std::cout << STR( QObject::tr( "Привет, Мир!" ) );
   return 0;
}
 

(http://i6.pixs.ru/storage/0/8/0/362png_1513154_13900080.png)


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 17:50
CP1251 и windows-1251 - это одно и тоже?



Название: Re: Вывод русских символов в консоль
Отправлено: sergek от Сентябрь 19, 2014, 17:55
CP1251 и windows-1251 - это одно и тоже?
Да. Только в виндах консоль досовская (IBM 866).


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 18:02
Надо будет постепенно основательно разобраться с этим вопросом. Я уже запутался :)

Вроде хорошая статья: ссылка (http://cppstudy.wordpress.com/2009/02/04/cyrillic-console/)

В ней есть ссыка на эту: Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов (http://local.joelonsoftware.com/wiki/%D0%90%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9_%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%2C_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9_%D0%9A%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9_%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA_%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%9E%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE_%D0%94%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD_%D0%97%D0%BD%D0%B0%D1%82%D1%8C_%D0%BE_Unicode_%D0%B8_%D0%9D%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%85_%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2)


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 19, 2014, 20:27
Возьми QTextStream и используй setCodec, что ты мучаешься?


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 19, 2014, 20:36
Возьми QTextStream и используй setCodec, что ты мучаешься?
Надо бы придумать, что-то простое и универсальное. Обёртку какую-нибудь. Чтобы не писать две версии ПО и чтобы можно было в консоль на русском выводить. Что такое "лингвист"?


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 19, 2014, 21:15
Лингвист для этого и нужен, чтобы можно было писать программу, а потом переводить ее на какие хочешь языки.
Почитай http://habrahabr.ru/post/51319/


Название: Re: Вывод русских символов в консоль
Отправлено: vizir.vs от Сентябрь 22, 2014, 11:37
CP1251 и windows-1251 - это одно и тоже?

Только кодировка, которую показывает codecForLocale() и кодировка консоли вещи разные. Как узнать кодировку консоли в винде уже писалось ранее. По-любому есть что-то подобное и под линем. А через qt не факт что ты сможешь глянуть кодировку консоли (я не нашел).


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Сентябрь 22, 2014, 11:59
Через qt и кодировку системы ты не узнаешь на прямую - codecForLocale выдаст тебе "System" и никак ты не узнаешь, что именно за кодировка это.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 27, 2014, 11:13
В VS C++ достаточно написать вначеле программы:
Код
C++ (Qt)
setlocale(LC_ALL, "rus");
 
Неужели в Qt нет простого и красивого решения?


Название: Re: Вывод русских символов в консоль
Отправлено: Bepec от Сентябрь 27, 2014, 11:14
VS это IDE написанная под Windows. Конечно там всё будет :)


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Сентябрь 27, 2014, 11:33
Придётся обёртки писать, чтобы примерно так выглядело:

Код
C++ (Qt)
#include "QCout.h"
#include "QCin.h"
 
int main()
{
   QCout qcout;
   QCin qcin;
 
   qcout << "Привет, Мир!" << qendl;
 
   return 0;
}
 
 


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 09:29
Пока вот такую штуку для вывода сделал:

Код
C++ (Qt)
#include "QCout.h"
 
int main()
{
   QCout qcout;
 
   qcout.write( "Привет\n" );
 
   return 0;
}
 

QCout.h
Код
C++ (Qt)
#ifndef QCOUT_H
#define QCOUT_H
 
#include <string>
#include <QTextStream>
#include <QTextCodec>
 
class QCout
{
public:
   QCout()
   {
       m_cout = new QTextStream( stdout );
       m_codec = QTextCodec::codecForName( "CP866" );
       m_cout->setCodec( m_codec );
   }
 
   ~QCout()
   {
       delete m_cout;
   }
 
   void write( const std::string &text )
   {
       QString qstrText( text.c_str( ) );
       ( *m_cout ) << qstrText;
       ( *m_cout ).flush();
   }
 
private:
   QTextStream *m_cout;
   QTextCodec *m_codec;
};
 
#endif // QCOUT_H
 


Название: Re: Вывод русских символов в консоль
Отправлено: vizir.vs от Октябрь 14, 2014, 09:40
Строго говоря у виндовой консоли не обязательно кодировка Cp866. Ее легко можно сменить на любую другую.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 09:48
Строго говоря у виндовой консоли не обязательно кодировка Cp866. Ее легко можно сменить на любую другую.
В кодировках нечего не понимаю. Что вы имеете ввиду? То есть у пользователя могут стоять другие настройки консоли и моя программа покажет кракозябы?


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 09:50
Конечно, могут стоять другие настройки. Поэтому попробуй для перестраховки использовать WinApi-шные функции в случае с виндой.
UINT WINAPI GetConsoleCP(void);
BOOL WINAPI SetConsoleCP(_In_  UINT wCodePageID);


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 09:55
Да а что в кодировках понимать. Это просто разные системы кодирования символов. Т.е. например в одной кодировке символ 'A' будет означать 10110101, а в другой 10000101, соответственно перед каждой манипуляцией с выводом текста, надо знать, на какой кодировке работает устройство, чтобы правильно перекодировать символы и не было кракозябр. И все, ничего больше понимать не надо. Разве что не забывать хранить все в unicode и уже потом кодировать в любые другие кодировки..


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 10:18
Могу ли я сразу учесть и Windows и Linux? Через директивы условной компиляции #ifdef

Подвох с unicode не понял. Можно же хранить кириллицу в std::string и даже в сишных строках char*, разве нет?


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 10:21
Конечно все можно учесть, на то и Qt))
Да неважно, где ты хранить будешь!
Главное, чтобы ты хранил тектстовые данные в юникодовской кодировке и всегда отталкивался от этого.


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 10:27
Был у меня случай когда-то. Приходили данные с сервера и я наивно запихивал их сразу в QString. В итоге долго удивлялся и не мог понять - как это так - некоторые данные читаются нормально, а другие кракозябрами, ведь QString хранит все в юникоде?? В итоге все оказалось, как всегда с кодировками - сначала узнай, в какой кодировке данные, перекодируй в юникод и только потом сохраняй и не допускай(или внимательно следи) скрытого перекодирования (как раз в случае QString).


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 10:37
Не подскажешь аналоги этих функций в Linux?
Код
C++ (Qt)
UINT WINAPI GetConsoleCP(void);
BOOL WINAPI SetConsoleCP(_In_  UINT wCodePageID);
 


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 10:52
Почитай вот это http://perlgeek.de/en/article/set-up-a-clean-utf8-environment
Не прямой ответ, но есть откуда оттолкнуться.


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 10:58
Спасибо тебе большое! Я ещё такое нашёл по поводу unicode: http://www.e-reading.me/chapter.php/136170/75/Blanshet,_Sammerfild_-_QT_4__programmirovanie_GUI_na_S++.html (http://www.e-reading.me/chapter.php/136170/75/Blanshet,_Sammerfild_-_QT_4__programmirovanie_GUI_na_S++.html)


Название: Re: Вывод русских символов в консоль
Отправлено: OKTA от Октябрь 14, 2014, 11:07
Да пожалуйста)
Если хочешь насобачиться работать с кодировками - сделай просто две программы (помню они есть у тебя - клиент и сервер). И пускай Сервер шлет Клиенту данные в разных кодировках, которые ты будешь задавать вручную на стороне Сервера. А Клиент пускай принимает и переводит все в юникод для хранения. (И конечно, вместе с текстовыми данными, Сервер должен отправлять и название кодировки).


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Октябрь 14, 2014, 11:15
Хорошо! Спасибо! Сделаю и здесь выложу

Как я понял, кириллицу нельзя сохранять в файл с помощью std::fstream и нужно использовать QFile или std::wfstream. Правильно ли я понял?


Название: Re: Вывод русских символов в консоль
Отправлено: 8Observer8 от Июль 09, 2015, 16:44
Вот такое решение: http://blog.harrix.org/?p=2829

Код
C++ (Qt)
#include <QCoreApplication>
#include <QTextCodec>
#include <iostream>
#include <string>
 
const char* convertFromUtfToLocal(const char* str)
{
   return QString::fromUtf8(str).toLocal8Bit().data();
}
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
 
   std::cout << convertFromUtfToLocal("Введите имя: ");
   std::string s;
   std::cin >> s;
   std::cout << convertFromUtfToLocal("Привет, ") << s << "!\n";
 
   return a.exec();
}


Название: Re: Вывод русских символов в консоль
Отправлено: ivanmara от Сентябрь 07, 2015, 15:25
Добрый день. Подскажите как ввести с консоли строку с пробелами (в ввели несколько слов нажали Enter) ?


Название: Re: Вывод русских символов в консоль
Отправлено: __Heaven__ от Сентябрь 07, 2015, 15:30
Лучше перефразируйте вопрос.

А так: вводите в консоли строку с пробелами и нажимаете Enter :)


Название: Re: Вывод русских символов в консоль
Отправлено: ivanmara от Сентябрь 07, 2015, 15:33
Лучше перефразируйте вопрос.

А так: вводите в консоли строку с пробелами и нажимаете Enter :)

Можно пример ?


Название: Re: Вывод русских символов в консоль
Отправлено: Авварон от Сентябрь 07, 2015, 16:29
Легко
Цитировать
привет, мир!



Название: Re: Вывод русских символов в консоль
Отправлено: ivanmara от Сентябрь 07, 2015, 17:32
Легко
Цитировать
привет, мир!


Очень смешно.


Название: Re: Вывод русских символов в консоль
Отправлено: ivanmara от Сентябрь 07, 2015, 17:36
Народ кто посерьезнее  и  владеет информацией. Покажите  плиз пример кода  ввода строки с пробелами в консоли?  QTextStream cin из нескольких введенных слов  в  результате  считавает только одно ...


Название: Re: Вывод русских символов в консоль
Отправлено: __Heaven__ от Сентябрь 08, 2015, 09:19
Народ кто посерьезнее  и  владеет информацией. Покажите  плиз пример кода  ввода строки с пробелами в консоли?  QTextStream cin из нескольких введенных слов  в  результате  считавает только одно ...
Вы свой первый пост прочитайте. Там нет конкретной информации о том, что именно вы хотите.

Код
C++ (Qt)
   QTextStream in(stdin);
   QString line = in.readLine();