MyTetra Share
Делитесь знаниями!
Русские буквы в консольных приложениях Qt4 под Linux
Время создания: 04.07.2025 11:09
Текстовые метки: linux, qt, qt4, cpp, c++, консоль, кодировка, charset, русский, кириллица, кракозябры, символы, буквы, терминал, UTF8, UTF-8, qDebug, локаль
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Локализация
Запись: xintrea/mytetra_syncro/master/base/1751616543wx8kj6owom/text.html на raw.github.com

Проблема


В фреймверке Qt4 для ОС Linux имеется небольшая недоработка по работе с кодировками. Внешне она выглядит так:



Даже если в системе настроена локаль из семейства UTF-8, например ru_RU.UTF-8, и терминал работает в UTF-8, и исходный код файла написан в кодировке UTF-8, то все равно, вывод русских букв на консоль через qDebug() или qWarning() будет некорректный: либо вместо символов будет пустота, либо символы будут выводиться в виде кракозябриков.



Традиционное решение, в виде настройки кодека для локали (иногда говорят - локали приложения, но это неверно), не помогает:



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



А все потому, что отладочный вывод никак не соотносится с Qt-приложением qApplication и его разновидностями. Отладочный вывод, так же как и вывод в обычный cout, существует вне зависимости от того, используется ли в бинарнике объект приложения или нет.


Настройка setCodecForLocale влияет только на внутренние преобразования строк в Qt4. Например, она будет использоваться при выполнении метода типа text.toLocal8Bit(). На консольный вывод эта настройка в Qt4 влияния не оказывает.



Решение


Как же правильно настроить Qt-код, чтобы корректно выводились кириллистические символы в консоль, и не приходилось каждую строку сопровождать вызовом fromUtf8() и совершать прочие непотребства? Вот готовое решение:



#include <QDebug>

#include <QTextCodec>


#include "main.h"


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

{

QTextCodec *codec = QTextCodec::codecForName("UTF-8");


QTextCodec::setCodecForLocale(codec);

QTextCodec::setCodecForTr(codec);

QTextCodec::setCodecForCStrings(codec);


qDebug() << "Это текст на русском языке.";

qDebug() << "This is english text.";

}



Здесь можно заметить, что в коде даже нет объекта qApplication. Потому что его наличие/отсутсвие никак не связано с проблемой.


В этом коде последовательно производится три настройки:



  • Настройка кодека для локали в пределах c++ кода (setCodecForLocale)
  • Настройка кодека для системы автоматического перевода на другие языки через специальную функцию tr() (setCodecForTr)
  • Настройка кодека для работы с "сырыми" C-строками (setCodecForCStrings)



И, по-сути, настройка кодека для "сырых" строк и решает проблему вывода в консоль правильных кириллистических символов. А для того, чтобы не наткнуться на проблемы в дальнейшем, лучше заранее в одном месте произвести настройки всех возможных подсистем Qt.


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