БлогNot. Вывод кириллицы в консоли QT5

Вывод кириллицы в консоли QT5

Распространённая у новичков проблема :) Следует понимать, что QT – кроссплатформенный продукт. Удовлетворительного решения для вывода кириллицы именно в консоли Windows (в отличие от Linux) нет. В QT5 можно попробовать:

QTextCodec *coding = QTextCodec::codecForName("utf-8");
coding->setCodecForLocale(coding);

или

system("chcp 65001");

если ваши файлы в Юникоде (UTF-8). Соответственно, "cp-1251" и "chcp 1251" для российской кодировки Windows. Сам текст файла .cpp, конечно же, тоже должен быть сохранён в нужной кодировке.

Популярное в сети решение с вызовом setCodecForCStrings и setCodecForTr работало только до QT4 включительно. А лучше делать свою консоль на основе QTextEdit, кроме работы с кодировками, будут возможности для оформления. Кроме того, для написания современных приложений следует, в общем случае, предпочитать Юникод.

Консольное приложение может быть реализовано и без использования класса QCoreApplication. В этом случае работа со стандартной консолью Windows возможна следующим образом:

#include <QTextStream>
#include <conio.h>

int main() {
 QTextStream cin(stdin); cin.setCodec("CP866");
 QTextStream cout(stdout); cout.setCodec("CP866");
 cout << QString::fromUtf8("Введите ваше имя: ");
 cout.flush();
 QString name;
 cin >> name;
 cout << QString::fromUtf8("Привет, ") <<
         name <<
         QString::fromUtf8("!") << endl;
 return 0;
}

Проверено в Windows 7 + QT5.2.1, сработало. Обратите внимание, что кодировка консоли здесь именно CP866 (DOS), как и было для DOS-приложений.

Кроме того, можно пользоваться стандартными возможностями C++ (setlocale)

P.S. В более новых сборках QT 5 со средой Creator 4.X приходилось также указывать CP866 только для ввода, а для вывода CP1251 (пример кода для консоли QT 5 показан ниже), менять шрифт, назначенный для консольных приложений и т.п. В целом, думаю, на проблеме зацикливаться не стоит, все ваши реальные приложения всё равно будут не-консольными и в UTF-8 :)

#include <iostream>
#include <QTextStream>
using namespace std;

int main() {
 setlocale(LC_ALL, "Rus");
 QTextStream cin(stdin); cin.setCodec("CP866");
 QTextStream cout(stdout); cout.setCodec("CP1251");

 QString name;
 cout << QString::fromUtf8("Как Вас зовут? ") << endl;
 cin >> name;
 cout << QString::fromUtf8("Привет, ") << name << "!";

 return 0;
}

теги: c++ qt язык

02.02.2016, 17:24; рейтинг: 9073