创建Unicode格式的INI文件
前段時間由于開發(fā)一個軟件,需要調(diào)用別人的接口,雖然我的軟件是Unicode編碼,對方的模塊也是Unicode編碼,但是對方提供的接口卻是Ansi接口,在非中文系統(tǒng)下,由于涉及到中文路徑,導(dǎo)致Ansi和Unicode編碼轉(zhuǎn)換出現(xiàn)錯誤,轉(zhuǎn)換結(jié)果不可逆轉(zhuǎn)。
當(dāng)OS的區(qū)域語言設(shè)置為中文時,轉(zhuǎn)換接口可以逆轉(zhuǎn),可以正常使用。
???? Microsoft提供了GetPrivateProfileStringA、WritePrivateProfileStringA、GetPrivateProfileStringW和WritePrivateProfileStringW用于讀寫INI文件;一下分成四種情況討論字符串內(nèi)部的轉(zhuǎn)換邏輯
1)、文件格式為ANSI
?????????a、調(diào)用GetPrivateProfileStringA和WritePrivateProfileStringA接口:首先轉(zhuǎn)換成GetPrivateProfileStringW和WritePrivateProfileStringW接口的調(diào)用,中間經(jīng)過了ANSI字符串到Unicode字符串的轉(zhuǎn)換(系統(tǒng)完成),然后在寫文件時,又將Unicode字符串轉(zhuǎn)換成Ansi字符串進(jìn)行存儲(系統(tǒng)完成),中間經(jīng)過了兩個不必要的轉(zhuǎn)換步驟;
?????????b、調(diào)用GetPrivateProfileStringW和WritePrivateProfileStringW接口:在寫文件時,將Unicode字符串轉(zhuǎn)換成Ansi字符串進(jìn)行存儲(系統(tǒng)完成),中間經(jīng)過了一個不必要的轉(zhuǎn)換步驟。
2)、文件格式為Unicode
?????????a、調(diào)用GetPrivateProfileStringA和WritePrivateProfileStringA接口:首先轉(zhuǎn)換成GetPrivateProfileStringW和WritePrivateProfileStringW接口的調(diào)用,中間經(jīng)過了ANSI字符串到Unicode字符串的轉(zhuǎn)換(系統(tǒng)完成),在寫文件時,不再需要轉(zhuǎn)換,中間經(jīng)過了一個個不必要的轉(zhuǎn)換步驟;
?????????b、調(diào)用GetPrivateProfileStringW和WritePrivateProfileStringW接口:由于文件格式和調(diào)用的接口都是Unicode格式,所以不存在中間轉(zhuǎn)換過程,提高了效率。
?
Unicode格式的INI文件創(chuàng)建
?由于系統(tǒng)默認(rèn)首次創(chuàng)建的文件為ANSI格式,所以需要在使用該文件之前,先用Unicode格式創(chuàng)建好INI文件,這樣在讀寫寫時就是正常的INI文件了。目前我知道創(chuàng)建文件有兩種格式:
? ? ? ? 1)、向文件中寫入Unicode的文件頭信息,具體文件寫入有
FILE *fp;
??? fp = _tfopen(_T("e://sss.ini"),_T("r"));
??? if (fp == NULL)
??? {
???????fp=_tfopen(_T("e://sss.ini"), _T("w+b"));
????????
??????? wchar_t m_strUnicode[1];
??????? m_strUnicode[0] = wchar_t(0XFEFF);
??????? fputwc(*m_strUnicode,fp);
??? }
??? fclose(fp);
?
???????? 2)、以Unicode格式創(chuàng)建新文件
???? FILE *pFile(NULL);
?????if((nRet= _wfopen_s(&pFile, m_wszConfigFile, L"wt, ccs=UNICODE")) == 0)
???????? fclose(pFile);
或者
? ? if((nRet= _wfopen_s(&pFile, m_wszConfigFile, L"wt, ccs=UTF-16LE")) == 0) ?
???????? fclose(pFile);
經(jīng)測試,windows下默認(rèn)編碼950,ccs=UTF-16LE創(chuàng)建的unicode格式文件可以正確寫入寬字符。
注意:調(diào)用讀寫INI文件的接口其實最后都是Unicode接口,具體寫入到文件中的內(nèi)容是由文件的格式?jīng)Q定,并非調(diào)用的接口決定。
總結(jié)
以上是生活随笔為你收集整理的创建Unicode格式的INI文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 实现数组的fore
- 下一篇: s3cmd常用命令