C++字串以及轉換整理
C++的字串 VS2019
最近在修改Chromium的專案中 遇到了char string wchar_t wstring tchar CString
我們挨個挨個來:
TCHAR
因為C++支援兩種字串,即常規的ANSI編碼(使用""包裹)和Unicode編碼(使用L""包裹),這樣對應的就有了兩套字串處理函式,比如:strlen和wcslen,分別用於處理兩種字串
TCHAR是通過define定義的字串巨集
當沒有定義_UNICODE巨集時,TCHAR = char,_tcslen =strlen當定義了_UNICODE巨集時,TCHAR = wchar_t , _tcslen = wcslen
ANSIchar szString[100]; strcpy(szString,"test"); Unicode wchar_t szString[100]; wcscpyszString,L"test");
tchar:標頭檔案:#include <tchar.h>
CString
CString:標頭檔案:#include <atlstr.h>
Cstring ,MFC的字串類
Cstring本質就是const TCHAR*
現在說下這兩個的轉換格式以及輸出
tchar->CString
#include <iostream> #include <tchar.h> #include<atlstr.h> using namespace std; int main() { setlocale(LC_ALL, "CHS"); TCHAR szTchar[18] = L"TCHAR"; CString str; str.Format(_T("%s"), szTchar); //cout不支援寬字元,如果需要使用UNICODE,需要使用wcout輸出寬字元 並且對CString做一下轉換 wcout << LPCTSTR(str) << endl; wcout << str.GetString() << endl;
system("pause");return 0; }
CString->tchar
#include <iostream> #include <tchar.h> #include <atlstr.h> using namespace std; int main() { setlocale(LC_ALL, "CHS"); TCHAR szTchar[18] = L"TCHAR"; //Tchar轉CString CString str; str.Format(_T("%s"), szTchar); wcout << LPCTSTR(str) << endl; //cout不支援寬字元,如果需要使用UNICODE,需要使用wcout輸出寬字元 並且對CString做一下轉換 wcout << str.GetString() << endl; //CString轉Tchar int iLen = str.GetLength(); TCHAR* szRs = new TCHAR[iLen]; lstrcpy(szRs, str.GetBuffer(iLen)); str.ReleaseBuffer(); system("pause"); return 0; }
wchar_t
char是8位字元型別,最多隻能包含256種字元,許多外文字符集所含的字元數目超過256個,char型無法表示。 wchar_t資料型別一般為16位或32位,但不同的C或C++庫有不同的規定 wstring 相當於const wchar_t wchar_t->wstring wstring->wchar_twchar_t a[100] = L"哇哈哈123a"; //wchar_t 轉 wstring wstring temp(a); //wstring 轉wchar_t const wchar_t* b = temp.c_str();
char 和 string
大家一定都熟悉啦
char c[100] = "哈哈哈"; //char 轉 string string strTemp(c); //string 轉 char const char* d = strTemp.c_str();
OK! 以上都是小樣子!
現在!我們來看看怎麼轉!
https://blog.csdn.net/mercy_ps/article/details/81218608
使用windows api
string轉wstring
wstring string2wstring(string str) { wstring result; //獲取緩衝區大小,並申請空間,緩衝區大小按字元計算 int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0); TCHAR* buffer = new TCHAR[len + 1]; //多位元組編碼轉換成寬位元組編碼 MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len); buffer[len] = '\0'; //新增字串結尾 //刪除緩衝區並返回值 result.append(buffer); delete[] buffer; return result; }
wstring轉string
string wstring2string(wstring wstr) { string result; //獲取緩衝區大小,並申請空間,緩衝區大小事按位元組計算的 int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL); char* buffer = new char[len + 1]; //寬位元組編碼轉換成多位元組編碼 WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL); buffer[len] = '\0'; //刪除緩衝區並返回值 result.append(buffer); delete[] buffer; return result; }
char ->wchar
wchar->char
/*備註: 1.需要先呼叫USES_CONVERSION巨集,因為引數定義都在這裡 2. 轉換巨集內部使用棧空間記憶體,最大2M,所以不要迴圈呼叫防止溢位*/ { USES_CONVERSION; wchar_t wsz[] = L"我是寬字元string"; char* pChar = W2A(wsz); char sz[] = "我是多位元組string"; wchar_t* pWChar = A2W(sz); }
還有一種 個人比較喜歡的
//wchar 轉 char wchar_t ws[100]; swprintf(ws, 100, L"%hs", "ansi string"); //char 轉 wchar char output[256]; WCHAR wc[] = L"Hellow World"; //sprintf_s(output, "%ws", wc); //都可
sprintf_s(output, "%ls", wc);
還有就是
瞭解下 %s %ls %hs %ws
std::string narrowstr = "narrow"; std::wstring widestr = L"wide"; printf("1 %s \n", narrowstr.c_str()); printf("2 %ls \n", widestr.c_str()); wprintf(L"3 %hs \n", narrowstr.c_str()); wprintf(L"4 %s \n", widestr.c_str());
對於printf
,%s表示窄字元字串。%ls意味著寬字元
但是,對於wprintf
,%s意味著寬,%ls將意味著寬本身。%hs意味著窄(對於兩者)。
對於這些%s %hs %ls %ws 我還有點犯糊塗....瞭解的小夥伴可以告訴我下
額外學習的點:https://www.cnblogs.com/ranjiewen/p/5435090.html
L表示UNICODE串,比如wchar_t* str = L"yangsongx"; _T在ANSI編譯模式下表示ANSI串,在UNICODE下表示UNICODE串,比如 TCHAR* str = _T("yangsongx"); 在ANSI下編譯就是 char* str = "yangsongx"; 在UNICODE下編譯就是 wchar_t* str = L"yangsongx";
//最後就是tchar和char wchar之間的轉換了
https://blog.csdn.net/pjf_1806339272/article/details/105967020
tchar 和char的轉換
TCHAR* CharToTCHAR(char* pChar) { TCHAR* pTchar = nullptr; int nLen = strlen(pChar) + 1; pTchar = new wchar_t[nLen]; MultiByteToWideChar(CP_ACP, 0, pChar, nLen, pTchar, nLen); return pTchar; } char* TCHARToChar(TCHAR* pTchar) { char* pChar = nullptr; int nLen = wcslen(pTchar) + 1; pChar = new char[nLen * 2]; WideCharToMultiByte(CP_ACP, 0, pTchar, nLen, pChar, 2 * nLen, NULL, NULL); return pChar; }
#ifdef _UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
wstring和Cstring
{ //wstring轉Cstring wstring wname = L"hshddg"; CString cstr(wname.c_str()); //Cstring 轉wstring CString name = _T("哈哈123"); std::wstring str = name.GetString(); }