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