MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Русские буквы в консольных приложениях Qt под Windows
23.09.2018
12:37
Автор: Harrix, Xintrea
Текстовые метки: консоль, windows, cmd, qt, qt5, кодировка, кракозябры, русский, символ
Раздел: Компьютер - Программирование - Язык C++ - Библиотека Qt - Локализация

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


В Qt версии 5 и выше поменялись некоторые настройки и стандартные костыли по отображению русских букв в консоли не работают.


Суть проблемы. В стандартной консольной программе вместо русского текста будет выведены крякозабры:



#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

Q_UNUSED(argc);

Q_UNUSED(argv);


   cout << "Привет!";

   return a.exec();

}





Решение.


Прописываем нужные кодировки:



#ifdef Q_OS_WIN32

   QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));

#endif

#ifdef Q_OS_LINUX

   QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

#endif



Здесь нужно обратить внимание, что QTextCodec существует независимо от объекта QApplication. Объекта приложения вообще нет в этих примерах кода.


Чтобы настройка QTextCodec работала, нужно еще подключить:



#include <QTextCodec>



А текст отображается в виде костыля:



QString::fromUtf8("Текст").toLocal8Bit().data()



Программа в итоге будет выглядеть так:


#include <iostream>

#include <QTextCodec>

using namespace std;

int main(int argc, char *argv[])

{

Q_UNUSED(argc);

Q_UNUSED(argv);

#ifdef Q_OS_WIN32

   QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));

#endif

#ifdef Q_OS_LINUX

   QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

#endif

   cout << QString::fromUtf8("Привет!").toLocal8Bit().data();

   return 0;

}






Если используете переменные, то будет попроще:



QString S="Здравствуйте!";

cout << S.toLocal8Bit().data();



Как можно еще упростить жизнь? В коде выше вывод шел в стандартную консоль cout. Но если выводить строки с использованием отладочного вывода, то никаких преобразований производит не надо:



qDebug() << "Привет!";



То есть, достаточно настроить значение QTextCodec::setCodecForLocale(кодировка) , и вывод qDebug() будет автоматически преобразовываться из UTF-8 (ведь файлы исходников в Qt пишутся в UTF-8) в нужную кодировку. То же самое касается и qInfo(), qWarning(), qCritical(), qFatal().



 
MyTetra Share v.0.52
Яндекс индекс цитирования