C++ qDebug()不';Windows上不支持unicode字符串

C++ qDebug()不';Windows上不支持unicode字符串,c++,windows,qt,unicode,qdebug,C++,Windows,Qt,Unicode,Qdebug,我有一个包含Unicode字符的文件名的行编辑,它在GUI中正确显示,但是当我使用qDebug()打印它时,它将Unicode符号显示为问号 例如,对于“C:/Test/аааба”此代码将仅显示“C:/Test/??” 这一行: qDebug() << ui->lineEditFileName->text(); qDebug()lineEditFileName->text(); 将显示: 这个问题只在Windows(XP和7)上发生,在Linux上可以正常工作。Q

我有一个包含Unicode字符的文件名的行编辑,它在GUI中正确显示,但是当我使用
qDebug()
打印它时,它将Unicode符号显示为问号

例如,对于
“C:/Test/аааба”
此代码将仅显示
“C:/Test/??”

这一行:

qDebug() << ui->lineEditFileName->text();
qDebug()lineEditFileName->text();
将显示:


这个问题只在Windows(XP和7)上发生,在Linux上可以正常工作。Qt的版本是4.8.0。

Linux的终端使用Unicode,Windows则不使用。您可以通过在
cmd
中键入
chcp
找到使用的代码页。您需要的是在输出字符串之前使用此代码页转换字符串:

QTextCodec *codec = QTextCodec::codecForName("CP866");
qDebug() << codec->fromUnicode(ui->lineEditFileName->text());

第二段代码将使“CP866”成为程序中所有字符串的默认编解码器。

似乎Unicode文本“在翻译中丢失”,因为Qt Creator在读取进程的调试输出时使用
QString::fromLocal8Bit()

我从以下方面找到了答案:

我不知道qDebug用什么把字符串放到控制台上 windows(我假设QString::toLocal8Bit)。我知道Qt Creator使用 QString::fromLocal8Bit(…)从进程中读取文本。那个 在任何地方都能很好地工作……但不幸的是,只有一个操作系统 它仍然坚持使用完全破坏任何功能的代码页 尝试在一个类型上显示多种脚本

还要检查控制面板中的“区域和语言”->“非Unicode程序”设置。它帮助我在调试控制台中修复错误的符号


在哪里可以找到@XandrGuard在Windows 10中描述的设置:语言->管理语言设置->更改系统区域设置->检查测试版:使用unicode utf-8。(需要重新启动)


qDebug()
在我的例子中,输出在Qt Creator的应用程序输出窗格中,而不是在cmd中,因为我的应用程序不是控制台应用程序。
应用程序输出使用
Utf-8
。你在使用不同的文本编解码器吗?不,我不使用,这发生在一个新创建的项目上,我只有一个行编辑和一个按钮,我做
qDebug()lineEdit->text()在按钮的插槽中。如果行编辑中的字符串是Unicode,则它在应用程序输出中显示为问号。Windows的终端绝对使用Unicode。不过,您可能没有选择具有足够字形的终端字体,但在Linux上也可能出现同样的错误。试想一下:
WriteConsoleW
的意义是什么?Qt Creator中可能存在相同的字体问题。输出面板使用哪种字体?你的意思是字体可能是问题所在?但是我不知道面板的字体是什么,只有一个字体设置,它是用于文本编辑器本身的,更改它不会影响应用程序输出窗格。Qt没有在内部执行正确的操作(转换为UTF-8或从UTF-8转换),也没有执行本机操作(在Windows上是UTF-16),而是使用本地8位编码并中断Unicode文本?不能责怪Windows,有两种明智的方法可以做到这一点,而Qt两者都不选。我同意,当它们控制两端并知道它们都支持UTF8时,没有理由选择本地8bit/fromLocal8Bit。这在Windows 10中也适用,只是非unicode程序的设置对话框更隐蔽一些。
int main()
{
    ...
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP866"));
    ...
}