要正确显示汉字,必须要先了解计算机文字编码相关知识,参考:
unicode ucs2 utf16 utf8 ansi GBK GB2312 互转 及 渲染_ucs2编码转换-CSDN博客
qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码及隐藏的字符编码转换 中文输出 乱码 原因-CSDN博客
1、汉字输出到 应用程序输出面板
qt 自定义的输出类qDebug() 、QDebug对象、QMessageLogger默认输出到 应用程序输出面板 。
这些输出工具类对象或方法内部代码会将所有的字符串转变为QString类型,然后会利用Windows.h中OutputDebugStringW(wchar_t*) 输出到面板上。当使用vs编译器时,你也可以直接调用这个windows API输出到面板上。
我们都知道QString类型中将字符串全部按unicode的utf16编码,每个字符都有两个字节保存(或四个字节)。正常来将,存放字符串到QString中时指定正确的编码,就能正确的显示字符串。
#include <QDebug>
#include <Windows.h>
int main()
{
QString str1 = QString::fromWCharArray(L"你好"); // 字符串前加L,强制将字符串保存为unicode utf16编码保存到字符串常量所在内存中。然后QString对象通过fromWcharArray函数将utf16编码字符串存到QString中。
QString str2 = QString::fromUtf8(u8"你好"); //字符串前加u8,强制将字符串保存为unicode utf8编码保存到字符串常量所在内存中。而后QString对象通过fromUtf8函数将utf8编码的字符串转换成utf16存到QString中。
qDebug()<<"str1:"<<str1<<endl<<"str2:"<<str2<<endl;
OutputDebugString(L"你好");
return 0;
}
如果不加前缀,就需要你对源文件的字符编码和编译器默认字符编码及要求有所了解, 可以参考这个:程序从源码到编译到显示过程中存在的字符编码及隐藏的字符编码转换
但有个意外:当qt使用mingw编译器时,输出到应用程序输出面板上时,给OutputDebugStringW()投喂unicode的utf-16编码(双字节)的字符串,会被先莫名其妙的转换为GBK,然后被莫名其妙的按字节扩张