Вы делаете ошибки в обеих фазах - входе и выходе.
Input
Вы не можете написать
QString szqLine = QString::fromUtf8("abc áéüóöú őű");
и надеемся получить в результате действительную строку Unicode, поскольку это не гарантируется стандартом C ++ (подробности см. в вопросе SO Источник C ++ в Unicode ).
Вы можете проверить, что у вас нет действительной строки Unicode, используя такой код
foreach(QChar ch, szqLine) {
qout << ch.unicode();
}
Если бы szqLine
была допустимой строкой Unicode, вы бы получили список кодовых точек Unicode символов в строке. В случае вашей строки вы не получите вывод.
Правильный способ сделать это так:
QChar const chars[] = { 'a', 'b', 'c', ' ', 255, 233, 252, 243, 246, 250, ' ', 337, 369};
QString s(&chars[0], sizeof(chars)/sizeof(QChar));
См. QString :: QString (const QChar * unicode, int size) , QChar :: QChar (int code) Функции Qt и Полная таблица символов UTF-8 для кодовых точек Unicode ваших персонажей.
выход
Консоль Windows использует одну конкретную кодовую страницу для ввода и другую для вывода (см. Кодовые страницы консоли ) при использовании стандартных механизмов ввода / вывода. Это ограничивает набор символов, которые вы можете вводить и отображать, чтобы они присутствовали в текущей кодовой странице. Однако вы можете использовать WriteConsole Win API для вывода любой строки Unicode, закодированной в UTF-16. Вы не можете избежать использования Win API здесь, потому что здесь нет Qt API. Ниже приведен полный пример, показывающий, как отображать символы из вашего вопроса на консоли Windows.
#include <QtCore/QCoreApplication>
#include <QString>
#include <QTextCodec>
#include <Windows.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QChar const chars[] = { 'a', 'b', 'c', ' ', 255, 233, 252, 243, 246, 250, ' ', 337, 369};
QString s(&chars[0], sizeof(chars)/sizeof(QChar));
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), s.utf16().constData(), s.size(), NULL, NULL);
return app.exec();
}