我有一个包含带有 Unicode 字符的文件名的行编辑,它在 GUI 中正确显示,但是当我使用 打印它时qDebug()
,它会将 Unicode 符号显示为问号。
例如,"C:/Test/абв"
此代码将仅显示"C:/Test/???"
.
这一行:
qDebug() << ui->lineEditFileName->text();
会显示:
此问题仅在 Windows(XP 和 7)上发生,在 Linux 上运行正常。Qt 的版本是 4.8.0。
似乎 Unicode 文本“在翻译中丢失”,因为 Qt CreatorQString::fromLocal8Bit()
在读取进程的调试输出时使用。
我从这个线程中找到了答案:
我不知道 qDebug 使用什么将字符串放到 Windows 上的控制台上(我假设是 QString::toLocal8Bit)。我知道 Qt Creator 使用 QString::fromLocal8Bit(...) 从进程中读取文本。这在任何地方都很好用……但不幸的是,有一个操作系统仍然坚持使用代码页,这完全破坏了在一种类型中显示多种脚本的任何尝试。
Linux 使用 Unicode 作为它的终端,Windows 没有。您可以通过键入 来了解使用了哪个代码chcp
页cmd
。您需要的是在输出之前使用此代码页转换您的字符串:
QTextCodec *codec = QTextCodec::codecForName("CP866");
qDebug() << codec->fromUnicode(ui->lineEditFileName->text());
或者为所有 c 字符串设置它:
int main()
{
...
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP866"));
...
}
第二段代码将使“CP866”成为程序中所有字符串的默认编解码器。