字串前面加L表示該字串是Unicode字串。
_T是一個宏,如果專案使用了Unicode字符集(定義了UNICODE宏),則自動在字串前面加上L,否則字串不變。因此, Visual C++裡邊定義字串的時候,用_T來保證相容性。 VC支援ascii和unicode兩種字元型別,用_T可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。
如 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,那就用後兩種方法。
1,用THCAR,LPTSTR,LPCTSTR等tchar資料型別的時候
2,用_tprintf之類的_t版本執行時函式時候
3,像下面這樣有w和a版本的api,呼叫CreateFile的時候
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
================
_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。那到底使用哪種字符集?編譯的時候才決定
在 C++ 中,標準庫提供的 std::string
並不直接規定其內部字元編碼格式。它只是一個字元容器,通常用於儲存以 char
型別表示的字串。因此,std::string
內部的字元編碼取決於你所使用的字符集和編譯器的設定。最常見的字元編碼是 ASCII 和 UTF-8。
以下是一些關於 C++ 中字串編碼的詳細資訊:
-
ASCII:在許多傳統和簡單的應用中,
std::string
內部儲存的字元是 ASCII 編碼的。ASCII 是一種7位編碼方案,每個字元佔用一個位元組。 -
UTF-8:這是現代應用程式中最常見的編碼方式。UTF-8 是一種變長字元編碼,每個字元可以佔用 1 到 4 個位元組。UTF-8 向後相容 ASCII,即 ASCII 字元在 UTF-8 中仍然佔用一個位元組。很多 C++ 程式在處理多語言文字時會使用 UTF-8 編碼。
-
其他編碼:雖然較少見,
std::string
也可以儲存其他編碼的字元資料,如 ISO-8859 系列編碼。
std::wstring
和 std::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_t
和char32_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;
}
參考: