Windows中的寬字符串處理問題

在用VC做開發的時候,對於一些字符串,會經常調用一般_t、_T、T(),其實這些東西都和Unicode有關係。比如說,AfxMessageBox(_T("Error! Fail to connect the database!"));這裏用到了一個_T(),不使用_T()有時候編譯會報錯。

Windows操作系統使用Unicode作爲默認的文本編碼格式。Unicode定義了對大於8位的字符編碼的支持。Windows使用UTF-16格式,稱爲寬字符編碼,UTF-16編碼以16位無符號整數爲單位,每個字符佔用兩個字節。許多Windows函數都定義了兩個入口點Unicode版本入口函數以W字符結尾,表示的是針對寬字符的;ANSI字符入口點函數則以A結尾。比如說,對於CreateMutex()存在CreateMutexW()和CreateMutexA()。編譯的時候根據是否定義了Unicode進行適當的函數調用。Windows內部使用的是寬字符,ANSI入口點實際上只是在寬字符版本函數調用之外加上包裝,進行適當的字符串轉換。

16位字符類型爲wchar_t,可以代替char類型。WCHAR是定義寬字符的等價形式,在源代碼中字符串都被解釋成8位的ANSI字符,所以需要將其指定爲寬字符,可以使用L說明符或者宏TEXT()來指定。

wchar_t str1[]=L”some text”;WCHAR st2[]=TEXT(“moretext”);

在定義了Unicode的情況下,TEXT()宏很有用,它會將字符串轉換爲寬字符格式;在未定義Unicode的情況下,它讓字符串保留8位ANSI文本格式。TCHAR類型與之類似,定義了Unicode時,解析爲wchar_t,否則解析成char。

有些函數也會根據是否定義了Unicode而採用不同的解析方式的宏。比如說,主函數_tmain()在定義UNICODE的情況下,解析爲wmain(),否則解析爲main();_tprintf()在定義了Unicode的情況下解析爲wprintf(),否則解析成printf()。

其實在使用_tmain的時候,利用Goto Definition可以看到,在stdafx.h裏面有這麼一行,#include <tchar.h>,所以使用_tmain()的時候必須使用#include<tchar.h>,在頭文件<tchar.h>裏找到_tmain的宏定義,

#define _tmain         main

經過預編譯以後,_tmain就變成main了。main()是標準C++的函數入口。標準C++的程序入口點函數,默認字符編碼格式ANSI函數原型爲:

int main();

int main(int argc, char* argv[]);

_tmain()是windows提供的對Unicode字符集和ANSI字符集進行自動轉換用的程序入口點函數,其原型爲int _tmain(int argc, TCHAR *argv[])。

當程序當前的字符集爲Unicode時,int _tmain(int argc, TCHAR *argv[])會被翻譯成

int wmain(int argc, wchar_t *argv[]);當程序當前的字符集爲ANSI時,int_tmain(int argc, TCHAR *argv[])會被翻譯成int main(int argc, char *argv[])。

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