如何使用QTextStream打印Unicode字符串?

时间:2017-03-02 09:04:45

标签: c++ windows qt unicode console

我想使用Qt(QTextStream)将Unicode文本打印到Windows控制台中。应使用SetConsoleOutputCP(CP_UTF8)函数将控制台的代码页设置为Unicode。但是,当我使用普通方式时,输出包含一些垃圾符号。

#include <QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QTextCodec>

#include <windows.h>

int main(int argc, char *argv[])
{
    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);

    QCoreApplication a(argc, argv);

    QTextStream stream(stdout);
    stream.setCodec("UTF-8");

    QString hello = "1 привет 2 привет 3 привет";
    stream << hello << endl;

    QString hello_en = "1 hello 2 hello 3 hello";
    stream << hello_en << endl;

    return a.exec();
}

Screenshot with output 1. 如您所见,在打印hello字符串后,还会打印垃圾符号,其中包含此字符串的一部分。但是只打印了由ASCII符号组成的hello_en字符串。

同时,如果QTextStream的编解码器设置为控制台的系统区域设置(在我的情况下是IBM 866),则不会打印垃圾符号。

#include <QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTextStream stream(stdout);
    stream.setCodec("IBM 866");

    QString hello = "1 привет 2 привет 3 привет";
    stream << hello << endl;

    QString hello_en = "1 hello 2 hello 3 hello";
    stream << hello_en << endl;

    return a.exec();
}

Screenshot with output 2. 如您所见,非ASCII符号可以正确打印。

因此,当我尝试使用QTextStream将Unicode字符串打印到Unicode控制台时,stdout中会出现一些垃圾符号。关于Stackoverflow的先前问题是在不使用QTextStream的情况下提出解决方案。

我做错了什么?或者我正确使用这个,这是Qt中的一个错误,我应该将它报告给Qt bug跟踪器?

更新1

此问题在Windows 8.1 Pro 64位上的Qt 5.8.0 MinGW 5.3.0 32位上出现。但是,当我尝试在我的系统上使用Qt 5.8.0 MSVC2015时,一切运行良好。我很迷惑。怎么了?但我可以使用MSVC2015,因为这不是必需的。

0 个答案:

没有答案