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
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] = '';             //添加字符串结尾  
    //删除缓冲区并返回值  
    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] = '';
    //删除缓冲区并返回值  
    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 
", narrowstr.c_str());
    printf("2 %ls 
", widestr.c_str());
    wprintf(L"3 %hs 
", narrowstr.c_str());
    wprintf(L"4 %s 
", 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();

    }
原文地址:https://www.cnblogs.com/Galesaur-wcy/p/15161916.html