gpt4 book ai didi

qt - Windows 控制台和 Qt Unicode 文本

转载 作者:行者123 更新时间:2023-12-02 05:37:45 25 4
gpt4 key购买 nike

我花了一整天的时间试图解决这个问题,但没有成功。我到处寻找但没有工作代码。

操作系统:Win XP Sp2IDE 和框架:C++、Qt Creator 2.0。

我试图将一些 unicode (UTF-8) 文本输出到 Windows 控制台,但我看到的只是乱码而不是 unicode 字符。我知道 win 控制台确实支持 unicode(自 win 2000 起)...至少根据维基百科和网上的许多信息,但我不知道如何使其与 Qt 一起工作。我见过的大多数“解决方案”(还没有见过很多)都使用 C++ 和 WInAPI 技术……我无法使用它们,因为这不是 Qt 方式。我正在使用 QStrings 和 Qt!

代码如下。我拿出了所有不同的东西,试图让帖子的代码保持简单。希望有人能让代码正常工作。

#include <QtCore/QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QDate>
#include <QFile>
using namespace std;

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

QTextStream qin(stdin);
QTextStream qout(stdout);

//The last 2 chars in QString each need a double slash for an accent.
QString szqLine = QString::fromUtf8("abc áéüóöú őű");

//I want this text console output to be in red text color.
qout << "Bellow are some unicode characters: " << endl;

//The Win XP console does not display the unicode chars correctly!!
//The cosole does not display unicode chars even though it is capable
//according to wikipedia. I just don't know how with Qt.
//I want this text output in white(or default font color, not red.)
qout << szqLine << endl;

//Would be nice to get some unicode input from console too.
qout << "Write some unicode chars like above: " << endl;
QString szqInput;
szqInput = QString::fromUtf8(qin.readLine());
qout << "You wrote: " << endl;
qout << szqInput << endl;



return app.exec();
}

最佳答案

好的,我用这段代码做了一些测试。不需要对控制台进行特殊设置。

#include <QTextStream>

#ifdef Q_OS_WIN32
#include <windows.h>
#include <iostream>
#else
#include <locale.h>
#endif

class ConsoleTextStream: public QTextStream {
public:
ConsoleTextStream();
ConsoleTextStream& operator<<(const QString &string);
};

ConsoleTextStream::ConsoleTextStream():
QTextStream(stdout, QIODevice::WriteOnly)
{
}

ConsoleTextStream& ConsoleTextStream::operator<<(const QString &string)
{
#ifdef Q_OS_WIN32
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
string.utf16(), string.size(), NULL, NULL);
#else
QTextStream::operator<<(string);
#endif
return *this;
}

class ConsoleInput: public QTextStream {
public:
ConsoleInput();
QString readLine();
};

ConsoleInput::ConsoleInput():
QTextStream(stdin, QIODevice::ReadOnly)
{
}

QString ConsoleInput::readLine()
{
#ifdef Q_OS_WIN32
const int bufsize = 512;
wchar_t buf[bufsize];
DWORD read;
QString res;
do {
ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE),
buf, bufsize, &read, NULL);
res += QString::fromWCharArray(buf, read);
} while (read > 0 && res[res.length() - 1] != '\n');
// could just do res.truncate(res.length() - 2), but better be safe
while (res.length() > 0
&& (res[res.length() - 1] == '\r' || res[res.length() - 1] == '\n'))
res.truncate(res.length() - 1);
return res;
#else
return QTextStream::readLine();
#endif
}

int main()
{
#ifndef Q_OS_WIN32
setlocale(LC_ALL, "");
#endif
ConsoleTextStream qout;
qout << QString::fromUtf8("Текст на иврите: לחם גרוזיני מסורתי הנאפה בתנור לבנים\n");
qout << QString::fromUtf8("Текст на японском: ※当サイト内コンテンツ・画像・写真データの、転載・転用・加工・無断複製は禁止いたします。\n");
qout << QString::fromUtf8("Текст на европейском: áéüóöú őű\n");
qout << flush; // needed on Linux
ConsoleInput qin;
QString s = qin.readLine();
qout << s << endl;
s = qin.readLine(); // one more time, to ensure we read everything ok
qout << s << endl;
return 0;
}

在 Windows 上,它会打印除俄语和欧洲语之外的所有文本的方框。 Lucida Console 似乎不支持希伯来语和日语。有趣的是,当我将文本从控制台复制到剪贴板,然后粘贴到支持 Unicode 的地方(例如在浏览器中)时,它确实显示正确。这证明Windows实际上输出了Unicode,只是不显示它。需要一些完全支持 Unicode 的控制台字体。

请注意,在上面的示例中,我仅覆盖了一个 operator<<() ,但如果我想使用它们,我需要覆盖它们,因为它们返回 QTextStream&但不是虚拟的,所以有必要让它们全部返回 ConsoleTextStream& ,否则类似 qout << 1 << someUnicodeString将无法正常工作。

我还在 Linux 上使用 UTF-8 语言环境测试了这个示例,运行完美。

使用 ReadConsoleW() 进行控制台输入是有效的,因为控制台默认配置为所谓的行输入模式,因此它会等到用户按下 Enter 键,但不会等到有足够的字符可填充缓冲区,因此它会这样做正是我们想要的:如果缓冲区大小足够,则读取一行。

关于qt - Windows 控制台和 Qt Unicode 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com