寬字符————_T、_TEXT、L、TEXT之間的區別


 _T、_TEXT、L、TEXT之間的區別

在分析前先對三者做一個簡單的分類

_T、_TEXT、TEXT三者都是根據編譯器的環境進行ANSI/UNICODE變換的,_T和_TEXT是根據_UNICODE來確定宏,而TEXT是根據UNICODE來確定宏,

(_UNICODE宏用於C運行期頭文件,而UNICOED則用於Windows頭文件,當編譯源代碼模塊時,通常必須同時定義這兩個宏

 

第一種:L" "

在字符串前加一個大寫字母L表示,告訴編譯器這個字符串按照寬字符來存儲,每個字符占2個字節

格式為或者,L的特點就是無論以什么方式編譯,一律按照Unicode來編譯(即每個字符占兩個字節),這里說每個字符占兩個字節,是因為Unicode字符集一般是指UTF-16編碼的Unicode,但Unicode字符集不等於每個字符占兩個字符

 在VC2010Express下可以通過項目--屬性--配置屬性--常規來看編譯方式

當使用Unicode字符集時,可以在C/C++--預處理器看到預編譯宏_UNICODE和UNICODE

當設置為使用多字節字符集時,預編譯宏會變為_MBCS

 

第二種:_T()和_TEXT()

_T和_TEXT都在頭文件tchar.h中定義,在字符串之間加_TEXT或者是_T的效果是一樣的,與L不同的是,如果項目使用了Unicode字符集(定義了UNICODE宏),則自動在字符串前面加上L,否則字符串不變

(意思是如果編譯環境使用的多字符節字符集 或者是 未設置,那么字符串不變),_T和_TEXT是根據_UNICODE來確定宏的

在tchar.h中可以找到如下的宏定義

 

 

使用格式:(注意:圓括號是不能省略的)

下面把環境改成多字節字符集

char ss[20] = _T("Hello World"); wchar_t mm[20] = L"Hello World"; printf("%s\n", ss); wprintf(L"%s", mm);

上面的代碼中ss這個窄字符數組后面的字符串前面加了一個_T,但因為環境是多字節字符集,_T並沒有起作用,字符串內容不變仍然按照窄字符存儲,而第二個寬字符數組mm就不能寫成_T或者_TEXT

因為不能把一個窄字符串存儲到一個寬字符數組中,如果寫成那么在編譯階段就會報錯

 

第三種:TEXT()

需要注意的是如果只#include<WinNT.h>編譯器是會報錯的,需要在#include<WinNT.h>前加上#include <Windows.h>才能使用TEXT,TEXT是根據UNICODE來確定宏的,因為當編譯環境使用Unicode字符集時,

因為預編譯宏包含了_UNICODEUNICODE,所以在使用Unicode字符集的環境下_T、_TEXT、TEXT都可以使用

使用格式:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM