Qt向ini文件寫入中文出現(xiàn)亂碼問題的解決方法詳解
現(xiàn)象描述
Qt中向ini文件寫中文出現(xiàn)亂碼問題,代碼如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mSetting = new QSettings("vdacfg.ini", QSettings::IniFormat);
}
void MainWindow::writeConfig()
{
mSetting->setValue("student/name", "xiongfei");
mSetting->setValue("student/age", "42");
mSetting->setValue("student/sex", "男");
mSetting->setValue("teacher/name", "劉春花");
mSetting->setValue("teacher/age", "42");
mSetting->setValue("teacher/major", "語文");
}
可是,打開vdacfg.ini文件,結(jié)果如下:

其中有中文的地方,sex,name,major都變成了十六進(jìn)制串。并且剛好這些十六進(jìn)制串就是對(duì)應(yīng)中文的UTF-8編碼結(jié)果。
例如,劉春花就是0x5218 0x66250x82b1。
原因分析
當(dāng)通過QSettings類寫入ini文件時(shí),必須指明編碼方式。如果沒有知名,默認(rèn)是沒有編碼方式的,通過QSettings::iniCodec() 返回的結(jié)果為null。
引用Qt的幫助文檔
QTextCodec *QSettings::iniCodec() const
Returns the codec that is used for accessing INI files. By default, no codec is used, so a null pointer is returned.
解決方案
增加一行代碼:
mSetting->setIniCodec(QTextCodec::codecForName("UTF-8"));
即修改后的代碼為:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
mSetting = new QSettings("vdacfg.ini", QSettings::IniFormat);
}
void MainWindow::writeConfig()
{
mSetting->setIniCodec(QTextCodec::codecForName("UTF-8"));
mSetting->setValue("student/name", "xiongfei");
mSetting->setValue("student/age", "42");
mSetting->setValue("student/sex", "男");
mSetting->setValue("teacher/name", "劉春花");
mSetting->setValue("teacher/age", "42");
mSetting->setValue("teacher/major", "語文");
}
然后,打開vdacfg.ini文件則是正確的中文字符了,如下圖所示。

知識(shí)補(bǔ)充
除了上文的方法,小編還為大家整理了Qt讀寫ini文件時(shí)出現(xiàn)中文亂碼問題的解決方法,希望對(duì)大家有所幫助
關(guān)鍵:
mSetting.setIniCodec(QTextCodec::codecForName("UTF-8"));
QString::fromLocal8Bit("中文")
(我用的VS2019+Qt5.6.3)
測(cè)試代碼:
QSettings mSetting("1.ini", QSettings::IniFormat);
mSetting.setIniCodec(QTextCodec::codecForName("UTF-8"));
mSetting.setValue("student/name", QString::fromLocal8Bit("xiongfei"));
mSetting.setValue("student/age", QString::fromLocal8Bit("42"));
mSetting.setValue("student/sex", QString::fromLocal8Bit("男"));
mSetting.setValue("teacher/name", QString::fromLocal8Bit("劉春花"));
mSetting.setValue("teacher/age", QString::fromLocal8Bit("42"));
mSetting.setValue("teacher/major", QString::fromLocal8Bit("語文"));
qDebug() << mSetting.value("teacher/major").toString();
可以解決中文亂碼問題?。?!
到此這篇關(guān)于Qt向ini文件寫入中文出現(xiàn)亂碼問題的解決方法詳解的文章就介紹到這了,更多相關(guān)Qt解決亂碼問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用C語言實(shí)現(xiàn)經(jīng)典游戲斗獸棋
《斗獸棋》是一款棋類游戲,整個(gè)游戲畫面是分為兩塊區(qū)域,中間有河流分割兩塊區(qū)域,有橋梁可以讓彼此的動(dòng)物過河,要取得勝利,必須占領(lǐng)那一邊動(dòng)物的巢穴獲勝利。本文將用C語言實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-03-03
C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狢語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解
本篇文章是對(duì)內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來2014-02-02

