В статье рассказывается об одном костыле для отображения русских букв в консольных приложениях 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().