QSettings 與中文(反斜槓 轉義)

2021-09-28 23:48:58 字數 1477 閱讀 4046

本文介紹的是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 中,斜槓已經用來作為...