qt是跨平台的開發平台。他的編譯器是要手動配置的,在window下一般我們用virtual stuido中cl,或者Mingw中的g++
在linux中一般采用Linux下的g++
而 微軟VS的中的cl,Mingw中的g++,Linux下的g++),源代碼分別采用 GBK 和 不帶BOM的UTF-8 以及 帶BOM的UTF-8 這3中編碼進行保存。
也就是說編譯器的編碼方式是不同的,所以大部分情況我們在qt代碼中寫中文時就會有亂碼
網上搜索得出
這兩段代碼可以解決大部分的亂碼問題。(記得加入#include<QTextCodec> 頭文件引用)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
其實上面的代碼的意思是告訴編譯器我們用什么樣的編碼方式來解讀我們寫的代碼。 一般在使用微軟的編譯器 我們在main函數中
QApplicationa(argc,argv);之后加入QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));。
使用g++編譯器我們使用QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
第2種方法
Qt5中,一些函數已經被取消了,而且網上很多都是不推薦這種寫法。所以當時找到的是自行轉換:
QTextCodec * BianMa = QTextCodec::codecForName ( "GBK" );
QMessageBox::information(this, "提示", BianMa->toUnicode("中文顯示!"));
其實也可以通過QString定義的靜態函數,先轉換成Unicode類型:
QString::fromLocal8Bit("提示")
不過在Qt5中,提供了一個專門的處理宏,來支持中文常量,那就是QStringLiteral,但它只能處理常量。
QMessageBox::information(this, QString::fromLocal8Bit("提示"), QStringLiteral("中文顯示"));
const char* info = "中文顯示";
//不支持
QString strInfo = QStringLiteral(info);
//支持
QString strInfo = QString::fromLocal8Bit(info);
對於中文常量,使用QStringLiteral即可解決,對於字符串變量,使用QString自帶函數也可以輕松解決。