|
|||||||
Русские буквы в консольных приложениях 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. Потому что его наличие/отсутсвие никак не связано с проблемой. В этом коде последовательно производится три настройки:
И, по-сути, настройка кодека для "сырых" строк и решает проблему вывода в консоль правильных кириллистических символов. А для того, чтобы не наткнуться на проблемы в дальнейшем, лучше заранее в одном месте произвести настройки всех возможных подсистем Qt. |
|||||||
Так же в этом разделе:
|
|||||||
![]() |
|||||||
|
|||||||
|