本文介紹的是qsettings的 iniformat 截止目前(qt4.7)對中文的支援情況,如果你想實現自己定義格式(比如"[中文] 中文=中文"這樣),可參看qsettings 自定義格式qt4.4(包含)之前
先看個例子:
結果如下:
[setcion]
key=\x6211\x662f\x6c49\x5b57
為什麼四個漢字變成這個樣子了呢?
因為4個漢字的unicode編碼超出了ascii碼的範圍,而將其序列化的話,有很多種不同的方案,而這些不同的方案中,對特定的人來說,只有一種方案是最合適的,其他的可能都被這特定的人稱作亂碼。
眾口難調啊?怎麼辦,那就不調了唄。直接給出utf-16編碼,這樣一來,儘管每個人都不太喜歡,但總比讓多數人都掃興要好得多。
qt4.5的轉變
從qt4.5開始,qsettings提供了乙個新的成員函式,setinicodec。這樣一來,各種非ascii碼的使用者應該高興一點了,喜歡什麼編碼自己來設定,而不用考慮什麼國際使用者。
對簡體中文使用者來說,gbk還是utf-8任意選擇乙個自己喜歡的就行了:
結果如下:
[setcion]
key=我是漢字key中的中文
截止到目前的qt4.6.3,key 和section的中文仍不能使用本地編碼,比如:
注意:此處字串連線用的qt4.6引入的%,如果是之前的版本,換成+並刪除相應標頭檔案即可。
結果如下:
[%u8282]
%u952e=我是漢字
同一開始的value一樣,key和section中非ascii字元的仍會進行轉義,此處我們看到的就是%u後跟utf-16的數值。該部分不受 setinicodec的影響。
不止中文這樣
其實不止中文是這樣,qt對傳統的latin系列編碼也沒有特殊的照顧
當section key value**現latin字元時,同樣將進行轉義。比如:
結果:
[%e0%e1]
%e0%e1=\xe0\xe1settings原始碼
%qtdir%\src\corelib\io\qsettings.cpp
qsettings的資料在記憶體中存放於 qmap中,讀寫檔案也就是將檔案讀入該map和從該map寫入檔案的過程。
ini檔案的寫入
bool qconffilesettingsprivate::writeinifile(qiodevice &device, const parsedsettingsmap &map
)key的寫入相對比較簡單,因為本身就是字串,只需序列化即可(對'0'-'9', 'a'-'z', 'a'-'z', '_', '-', '.'之外的字元進行轉義處理)。
void qsettingsprivate::iniescapedkey(const qstring &key, qbytearray &result)
value的寫入就很複雜了,分兩步走:
將字串序列化
正斜槓( )與反斜槓( )區別
正斜槓,符號是 反斜槓,符號是 一直很不解正斜槓與反斜槓到底有何區別?經過一段時間的理解,得出 dos路徑 e 開發資料 asp.net高階開發 這是反斜槓的作用後面跟著的是檔名 csc t library r system.web.dll out d customhandler.dll d cus...
反斜槓 與 區別
unix 作業系統設計了這種路徑分隔法,它使用斜槓 由於網路是首先應用在 unix 計算機之間的,至今為止,一半以上的網路伺服器仍是使用 unix 作業系統的,所以 也沿用了斜槓作路徑分隔符。微軟在開發 dos 2.0 的時候,從 unix 中借鑑了這種目錄結構,但由於 dos 中,斜槓已經用來作為...
反斜槓 與 區別
unix 作業系統設計了這種路徑分隔法,它使用斜槓 由於網路是首先應用在 unix 計算機之間的,至今為止,一半以上的網路伺服器仍是使用 unix 作業系統的,所以 也沿用了斜槓作路徑分隔符。微軟在開發 dos 2.0 的時候,從 unix 中借鑑了這種目錄結構,但由於 dos 中,斜槓已經用來作為...