C++字符串以及转换整理
C++的字符串 VS2019
最近在修改Chromium的项目中 遇到了char string wchar_t wstring tchar CString
我们挨个挨个来:
TCHAR
因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和wcslen,分别用于处理两种字符串
TCHAR是通过define定义的字符串宏
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
wchar_t a[100] = L"哇哈哈123a"; //wchar_t 转 wstring wstring temp(a); //wstring 转wchar_t const wchar_t* b = temp.c_str();
![](https://img2020.cnblogs.com/blog/1162428/202108/1162428-20210819140953267-1295846290.png)
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(); }