大家喜欢在windows下用qt写代码编译运行似乎没什么中文乱码,或者用qt creator写的代码编译无乱码,然后用vs集成的qt编译就出现乱码了,或者把代码移植到linux编译运行又出现乱码了。这个问题还是挺常见的,同时也令人头疼的问题。这里我就用文本编辑工具Notepad++以及linux的qt creator演示本次中文乱码问题。
首先打开qt creator编辑一下代码
#include<QApplication>
#include<QPushButton>
#include <QTextCodec>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
QTextCodec *utf8 = QTextCodec::codecForName("utf8");//设置编码为utf8
char utf81[20]= {0xE4,0xB8,0xAD,0xE5,0x9B,0xBD};//使用notepad编码为utf8编码,打上中国,然后转换为十六进制显示,然后复制到这里,utf8占6个字节
QPushButton hellobtn(utf8->toUnicode(utf81),0);//因为qt显示是使用unicode显示,所以要把utf8编码转换为unicode编码即可
hellobtn.resize(200,50); //
hellobtn.show();
return a.exec();
}
然后使用gbk编码与上面形成对比的代码如下:
#include<QApplication>
#include<QPushButton>
#include <QTextCodec>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
QTextCodec *gbk= QTextCodec::codecForName("gbk");
char gbk1[20] = {0xD6,0xD0,0xB9,0xFA};//中国字符用gbk编码,gbk占四个字节
QPushButton hellobtn(gbk->toUnicode(gbk1),0);//因为qt显示是使用unicode显示,所以要把gbk编码转换为unicode编码即可
hellobtn.resize(200,50); //
hellobtn.show();
return a.exec();
}
通过上面的两个代码我们来总结一下乱码问题:
1、首先要明确你字符本身是用什么编码,知道了字符的编码那么我们就用什么编码转换成另外 一个编码,比如上面的第一段程序,我字符本身编码是utf8,那么就设置utf8编码,然后再转成unicode编码。
2、还有文本本身是什么编码也是会影响字符串乱码的问题,不过我们知道了文本即代码是什么编码我们就用哪种编码即可。
3、就是qt界面用显示是unicode编码,不过目前最新版qt好像会自动转换成unicode编码。
补充如下
由上图的代码和打印可以知道qt编辑器下使用utf8编码导入QString后自动转换为unicode编码了。