c++ L _T()

redrobot發表於2024-05-22

字串前面加L表示該字串是Unicode字串。
_T是一個宏,如果專案使用了Unicode字符集(定義了UNICODE宏),則自動在字串前面加上L,否則字串不變。因此, Visual C++裡邊定義字串的時候,用_T來保證相容性。 VC支援ascii和unicode兩種字元型別,用_T可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。

以下是別人的總結:
一、在字串前加一個L作用:
如 L"我的字串" 表示將ANSI字串轉換成unicode的字串,就是每個字元佔用兩個位元組。
strlen("asd") = 3;
strlen(L"asd") = 6;
二、 _T宏可以把一個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目標環境選擇合適的(Unicode還是ANSI)字元處理方式
如果你定義了UNICODE,那麼_T宏會把字串前面加一個L。這時 _T("ABCD") 相當於 L"ABCD" ,這是寬字串。
如果沒有定義,那麼_T宏不會在字串前面加那個L,_T("ABCD") 就等價於 "ABCD"
三、TEXT,_TEXT 和_T 一樣的
如下面三語句:
TCHAR szStr1[] = TEXT("str1");
char szStr2[] = "str2";
WCHAR szStr3[] = L("str3");
那麼第一句話在定義了UNICODE時會解釋為第三句話,沒有定義時就等於第二句話。
但二句話無論是否定義了UNICODE都是生成一個ANSI字串,而第三句話總是生成UNICODE字串。
為了程式的可移植性,建議都用第一種表示方法。但在某些情況下,某個字元必須為ANSI或UNICODE,那就用後兩種方法。
別人的總結2:
你要確定你需要的字串是寬字元還是窄字元。_T("")是說如果你定義了UNICODE 那麼就是L"",沒有定義就是"";以下情況用_T()比較好,其他情況最好別用:
1,用THCAR,LPTSTR,LPCTSTR等tchar資料型別的時候
2,用_tprintf之類的_t版本執行時函式時候
3,像下面這樣有w和a版本的api,呼叫CreateFile的時候
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
來自:https://blog.csdn.net/Awey_001/article/details/6130795

================

_T("")是一個宏,他的作用是讓你的程式支援Unicode編碼,因為Windows使用兩種字符集ANSI和UNICODE,
前者就是通常使用的單位元組方式,但這種方式處理象中文這樣的雙位元組字元不方便,容易出現半個漢字的情況。
而後者是雙位元組方式,方便處理雙位元組字元。

Windows NT的所有與字元有關的函式都提供兩種方式的版本,而Windows 9x只支援ANSI方式。如果你編譯一個程式為ANSI方式,_T實際不起任何作用。而如果編譯一個程式為UNICODE方式,則編譯器會把"Hello"字串以UNICODE方式儲存。_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以UNICODE方式儲存。

LPSTR:32bit指標指向一個字串,每個字元佔1位元組

LPCSTR:32-bit指標指向一個常字串,每個字元佔1位元組
LPCTSTR:32-bit指標指向一個常字串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義
LPTSTR:32-bit指標每字元可能佔1位元組或2位元組,取決於Unicode是否定義

L是表示字串資源為Unicode的。

比如
wchar_t Str[] = L"Hello World!";
這個就是雙子節儲存字元了。

_T是一個適配的宏~


#ifdef _UNICODE的時候
_T就是L
沒有#ifdef _UNICODE的時候
_T就是ANSI的。

比如

LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上兩句使得無論是在UNICODE編譯條件下都是正確編譯的。

而且MS推薦你使用相匹配的字串函式。
比如處理LPTSTR或者LPCTSTR 的時候,不要用strlen ,而是要用_tcslen

否則在UNICODE的編譯條件下,strlen不能處理 wchar_t*的字串。

T是非常有意思的一個符號(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一種中間型別,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。那到底使用哪種字符集?編譯的時候才決定

來自:https://www.cnblogs.com/wecfly/p/15469017.html
c++ string 中的 編碼格式:

在 C++ 中,標準庫提供的 std::string 並不直接規定其內部字元編碼格式。它只是一個字元容器,通常用於儲存以 char 型別表示的字串。因此,std::string 內部的字元編碼取決於你所使用的字符集和編譯器的設定。最常見的字元編碼是 ASCII 和 UTF-8。

以下是一些關於 C++ 中字串編碼的詳細資訊:

  1. ASCII:在許多傳統和簡單的應用中,std::string 內部儲存的字元是 ASCII 編碼的。ASCII 是一種7位編碼方案,每個字元佔用一個位元組。

  2. UTF-8:這是現代應用程式中最常見的編碼方式。UTF-8 是一種變長字元編碼,每個字元可以佔用 1 到 4 個位元組。UTF-8 向後相容 ASCII,即 ASCII 字元在 UTF-8 中仍然佔用一個位元組。很多 C++ 程式在處理多語言文字時會使用 UTF-8 編碼。

  3. 其他編碼:雖然較少見,std::string 也可以儲存其他編碼的字元資料,如 ISO-8859 系列編碼。

std::wstringstd::u16string 等其他字串型別:

  • std::wstring:用於儲存寬字元(wchar_t),其大小取決於編譯器和平臺。在 Windows 上通常是 2 位元組,表示 UTF-16 編碼。在 Unix 系統(如 Linux 和 macOS)上通常是 4 位元組,表示 UTF-32 編碼。

  • std::u16string 和 std::u32string:C++11 引入了這兩種字串型別,分別用於儲存 UTF-16 和 UTF-32 編碼的字串資料。它們使用 char16_tchar32_t 型別來表示字元。

#include <iostream>
#include <string>

int main() {
std::string ascii_str = "Hello, World!";
std::wstring wide_str = L"Hello, World!";
std::u16string u16_str = u"Hello, World!";
std::u32string u32_str = U"Hello, World!";

std::cout << "std::string (ASCII/UTF-8): " << ascii_str << std::endl;
std::wcout << L"std::wstring (UTF-16/UTF-32): " << wide_str << std::endl;
// For u16string and u32string, use a loop to print each character as there's no direct support in std::cout
std::cout << "std::u16string (UTF-16): ";
for (char16_t c : u16_str) {
std::cout << char(c);
}
std::cout << std::endl;

std::cout << "std::u32string (UTF-32): ";
for (char32_t c : u32_str) {
std::cout << char(c);
}
std::cout << std::endl;

return 0;
}

參考:

相關文章