天天看點

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;

}      
C++字元串以及轉換整理

 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;

}      
C++字元串以及轉換整理

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();      
C++字元串以及轉換整理

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());      
C++字元串以及轉換整理

對于​

​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();

    }