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都變成了十六進制串。并且剛好這些十六進制串就是對應(yīng)中文的UTF-8編碼結(jié)果。
例如,劉春花就是0x5218 0x66250x82b1。
原因分析
當通過QSettings類寫入ini文件時,必須指明編碼方式。如果沒有知名,默認是沒有編碼方式的,通過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文件則是正確的中文字符了,如下圖所示。
知識補充
除了上文的方法,小編還為大家整理了Qt讀寫ini文件時出現(xiàn)中文亂碼問題的解決方法,希望對大家有所幫助
關(guān)鍵:
mSetting.setIniCodec(QTextCodec::codecForName("UTF-8")); QString::fromLocal8Bit("中文")
(我用的VS2019+Qt5.6.3)
測試代碼:
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于vector迭代器失效的幾種情況總結(jié)
下面小編就為大家?guī)硪黄P(guān)于vector迭代器失效的幾種情況總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12