Unicode和ANSI編碼環境下編譯字符串的問題求解

利用C/C++編程時,常常因爲對字符串的不規範的操作導致許多讓初學者感到莫名其妙的編譯錯誤,查來查去,原來是編碼方式的問題,解決辦法是在 “項目” ->“屬性”中設置使用適當的字符集,如把原來的“Use Unicode Character Set”改爲 “Not Set”,等等。這裏的緣由到底是什麼?本文做一簡單探究。

簡單說,Unicode和ANSI是兩種不同的字符編碼方式(詳情見百度),我們使用的字符串類型有的是Unicode編碼格式的,有的是ANSI編碼格式的,沒有區分地隨意操作字符串時,編譯錯誤便產生了。

關於此,更詳細地,我們引用http://blog.sina.com.cn/s/blog_6da8e3ef0101c1y2.html的內容:


如果設置爲“使用 Unicode 字符集”,那麼這個意思就是告訴編譯器將會以Unicode方式來編譯程序代碼;
VC2005中默認使用Unicode編碼,也主是說編譯器默認用Unicode方式來編譯程序,我們在程序當中經常使用字符串操作,比如char,wchar_t,MFC的CString類都是對字符串操作的,但char是ANSI的,wchar_t是寬字符可以存儲Unicode,CString 則封裝了wchar_t,我們可以看到CString對應的字符串應該是TCHARTCHAR的定義是這樣的
typedef wchar_t TCHAR    ;   
#else   
typedef char TCHAR;   
#endif </span>

也就是說當使用Unicode時CString是wchar_t類使用非Unicode時,CString被映射成char,剛纔我們說了VS2005是使用Unicode編碼的,有CString會被映射成wchar_t類型,所以們有操作存儲CString類的字符時就要注意將需要存儲的字符串轉換成wchar_t類型,比如用_T("")來操作。


事實上,關於此類錯誤,在C++中最常見的一個是CString和LPCTSTR的使用錯誤,另一篇博文對此作出了很好的解析http://www.cnblogs.com/CBDoctor/archive/2012/09/11/2679622.html


CString LPCTSTR區別聯繫
CString是一個動態TCHAR數組,BSTR是一種專有格式的字符串(需要用系統提供的函數來操縱,LPCTSTR只是一個常量的TCHAR指針。

CString 是一個完全獨立的類,動態的TCHAR數組,封裝了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;
typedef const char * LPCTSTR;

vc++中各種字符串的表示法
首先char* 是指向ANSI字符數組的指針,其中每個字符佔據8位(有效數據是除掉最高位的其他7位),這裏保持了與傳統的C,C++的兼容。


LP的含義是長指針(long pointer)。LPSTR是一個指向以‘\0’結尾的ANSI字符數組的指針,與char*可以互換使用,在win32中較多地使用LPSTR。

而LPCSTR中增加的‘C’的含義是“CONSTANT”(常量),表明這種數據類型的實例不能被使用它的API函數改變,除此之外,它與LPSTR是等同的。
1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區別,而在win32下是沒有區別的,都是32位.所以這裏的LP和P是等價的.
2.C表示const
3.T是什麼東西呢,我們知道TCHAR在採用Unicode方式編譯時是wchar_t,在普通時編譯成char.

LPWSTR與LPCWSTR由此產生,它們的含義類似於LPSTR與LPCSTR,只是字符數據是16位的wchar_t而不是char。

LPTSTR和LPCTSTR中的含義就是每個字符是這樣的TCHAR。

CString類中的字符就是被聲明爲TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章