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
ANSI
char 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_t
wchar_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 我還有點犯糊塗....了解的小夥伴可以告訴我下
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();
}