• 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();
    
        }
  • 相关阅读:
    css设置兄弟节点的样式(相邻的前一个节点)
    css文本强制两行超出就显示省略号,不显示省略号
    Adobe Photoshop CC2014 for MAC 详细破解步骤
    CSS实现背景图片透明和文字不透明效果
    jquery实现搜索框从中间向两边扩展(左右放大)
    微信小程序拒绝授权后提示信息以及重新授权
    linux下的 sudo ln -s 源文件 目标文件
    小程序实现倒计时:解决ios倒计时失效(setInterval失效)
    浅谈CSS高度坍塌
    sourcetree安装以及跳过sourcetree注册登录
  • 原文地址:https://www.cnblogs.com/Galesaur-wcy/p/15161916.html
Copyright © 2020-2023  润新知