我想使用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();
}
如您所见,在打印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();
}
如您所见,非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,因为这不是必需的。