1. 程式人生 > 其它 >C++字串以及轉換整理

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] = '\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();

    }