• string, CStringA, char*与wstring, CStringW, wchar_t*相互转换


    1. char*转换为wchar_t*

    char buf[] = "我是韩长鸣haizeiwanghancm";
    wchar_t wbuf[100];

    1.1. C的方式:最可移植的方式

    1.1.1. mbstowcs

    setlocale(LC_CTYPE, "");
    mbstowcs(wbuf, buf, sizeof(buf));

    1.1.2. swprintf

    setlocale(LC_CTYPE, "");
    swprintf(wbuf, L"%S", buf);


    1.2. Windows平台的方式

    1.2.1. wsprintf

    wsprintf(wbuf, L"%S", buf);

    1.2.2. MultiByteToWideChar

    //返回需要的多字节数目(包括结尾'')
        int len = MultiByteToWideChar(
            CP_ACP,      //多字节相关的代码页
            0,           //额外控制,影响变音符号,一般设为0
            buf,         //char缓冲区
            -1,          //char字符个数,-1函数自动判断长度
            NULL,        //wchar_t缓冲区
            0);          //wchar_t缓冲区最大字节数,传入0:不执行转换,返回需要的宽字节数目(包括结尾'')

        wchar_t *wbuf2 = new wchar_t[len * sizeof(wchar_t)];
        if (wbuf == nullptr) {
            return 0;
        }

        MultiByteToWideChar(CP_ACP, 0, buf, -1, wbuf2, len);

    1.3. ATL,MFC可用的方式

    1.3.1. A2W

      USES_CONVERSION;
      MessageBoxW(nullptr, A2W(buf), nullptr, 0);

    1.3.2. CStringW

    CStringW str = buf;

    //这里存在一个operator const wchar_t*的操作符重载
    MessageBox(nullptr, str, nullptr, 0);

    2. wchar_t*转char*相似的过程,看最后的程序

    3. 附赠: CStringW, CStringA, wstring,string, wchar_t*, char*的相互转换

    //7. string转wchar_t*
        string str1 = "string方式, jsfoej韩长鸣fiok";
        wstring ch(str1.size(), 0);
        setlocale(LC_CTYPE, "");
        mbstowcs(&ch[0], str1.c_str(), str1.size());
        MessageBoxW(nullptr, ch.c_str(), nullptr, 0);

        //8. CStringA转wchar_t*
        CStringA CStr = "CStringA方式jsofj韩长鸣eof";
        CStringW WStr = CStr;
        MessageBox(nullptr, WStr, nullptr, 0);

        //9. CStringA转string,直接赋值
        CStringA Astr(L"韩长鸣sjfo");
        string s = Astr;
        cout << s << endl;

        //10. string转CStringA, CString = string.c_str();

        //11. CStringA转wstring: CStringW = CStringA; wstring = CStringW;

        //12. string转CStringW: CStringA = string.cstr(); CStringW = CStringA;

    //7. wstring转char*
        wstring str1 = L"wstring方式, jsfoej韩长鸣fiok";
        string ch(str1.size(), 0);
        setlocale(LC_CTYPE, "");
        wcstombs(&ch[0], str1.c_str(), str1.size());
        MessageBoxA(nullptr, ch.c_str(), nullptr, 0);

        //8. CStringW转char*
        CStringW CStr = "CStringW方式jsofj韩长鸣eof";
        CStringA AStr = CStr;
        MessageBoxA(nullptr, AStr, nullptr, 0);

        //9. CStringW转wstring,直接赋值
        CStringW wstr(L"韩长鸣sjfo");
        wstring ws = wstr;
        wcout << ws << endl;

        //10. wstring转CStringW, CStringW = wstring.c_str();

        //11. CStringW转string: CStringA = CStringW; string = CStringA;

        //12. wstring转CStringA: CStringW = wstring.cstr(); CStringA = CStringW;

    //char*转wchar_t*

      1 #include <Windows.h>    //for wsprintf, MultiByteToWideChar,WideCharToMultiByte
      2 #include <cstdio>       //for swprintf 
      3 #include <atlconv.h>    //for A2W(),W2A()
      4 #include <atlstr.h>     //for CString
      5 #include <locale>
      6 #include <string>
      7 #include <iostream>
      8 
      9 using std::cout;
     10 using std::wcout;
     11 using std::endl;
     12 using std::string;
     13 using std::wstring;
     14 using std::locale;
     15 
     16 #pragma warning(disable : 4996)
     17 
     18 int main(void)
     19 {
     20     char buf[] = "我是韩长鸣haizeiwanghancm";
     21     wchar_t wbuf[100];
     22 
     23     //1. CRT的swprintf()函数
     24     MessageBoxW(NULL, L"swprintf", nullptr, 0);
     25     //C方式的必须设置本地化locale
     26     //locale old_loc = locale::global(locale(""));
     27     setlocale(LC_CTYPE, "");
     28     swprintf(wbuf, L"%S", buf);
     29     MessageBoxW(NULL, wbuf, NULL, 0);
     30     //locale::global(old_loc);
     31 
     32     //2. windows的wsprintf()函数
     33     //汉字:wsprintf没问题
     34     //%S: 宽字符
     35     MessageBoxW(NULL, L"wsprintf", nullptr, 0);
     36     wsprintf(wbuf, L"%S", buf);
     37     MessageBoxW(NULL, wbuf, NULL, 0);
     38     // 也直接使用带A的函数,
     39     //在内部它会使用多字节转换函数将字符串传换为wchar_t*
     40     MessageBoxA(NULL, buf, NULL, 0);
     41 
     42     
     43 
     44     //3. Windows的MultiByteToWideChar(): 都没问题
     45 
     46     MessageBoxW(NULL, L"MultiByteToWideChar函数", nullptr, 0);
     47 
     48     //返回需要的多字节数目(包括结尾'')
     49     int len = MultiByteToWideChar(
     50         CP_ACP,      //多字节相关的代码页
     51         0,           //额外控制,影响变音符号,一般设为0
     52         buf,         //char缓冲区
     53         -1,          //char字符个数,-1函数自动判断长度
     54         NULL,        //wchar_t缓冲区
     55         0);          //wchar_t缓冲区最大字节数,传入0:不执行转换,返回需要的宽字节数目(包括结尾'')
     56 
     57     wchar_t *wbuf2 = new wchar_t[len * sizeof(wchar_t)];
     58     if (wbuf == nullptr) {
     59         return 0;
     60     }
     61 
     62     MultiByteToWideChar(CP_ACP, 0, buf, -1, wbuf2, len);
     63     MessageBoxW(NULL, wbuf2, NULL, 0);
     64     delete[] wbuf2;
     65 
     66     //4. CTR的mbstowcs()函数
     67     MessageBoxW(NULL, L"mbstowcs函数", nullptr, 0);
     68     setlocale(LC_CTYPE, "");
     69     //locale old_loc = locale::global(locale(""));
     70     mbstowcs(wbuf, buf, sizeof(buf));
     71     //locale::global(old_loc);
     72     MessageBoxW(nullptr, wbuf, nullptr, 0);
     73 
     74     //5. ATL的A2W在MFC中也可以
     75     MessageBoxW(nullptr, L"A2W()", nullptr, 0);
     76     USES_CONVERSION;
     77     MessageBoxW(nullptr, A2W(buf), nullptr, 0);
     78 
     79     //6. ATL的CStringW
     80     MessageBoxW(nullptr, L"CString方式", nullptr, 0);
     81     CStringW str = buf;
     82     MessageBox(nullptr, str, nullptr, 0);
     83 
     84     //7. string转wchar_t*
     85     string str1 = "string方式, jsfoej韩长鸣fiok";
     86     wstring ch(str1.size(), 0);
     87     setlocale(LC_CTYPE, "");
     88     mbstowcs(&ch[0], str1.c_str(), str1.size());
     89     MessageBoxW(nullptr, ch.c_str(), nullptr, 0);
     90 
     91     //8. CStringA转wchar_t*
     92     CStringA CStr = "CStringA方式jsofj韩长鸣eof";
     93     CStringW WStr = CStr;
     94     MessageBox(nullptr, WStr, nullptr, 0);
     95 
     96     //9. CStringA转string,直接赋值
     97     CStringA Astr(L"韩长鸣sjfo");
     98     string s = Astr;
     99     cout << s << endl;
    100 
    101     //10. string转CStringA, CString = string.c_str();
    102 
    103     //11. CStringA转wstring: CStringW = CStringA; wstring = CStringW;
    104 
    105     //12. string转CStringW: CStringA = string.cstr(); CStringW = CStringA;
    106 
    107     return 0;
    108 }

    //wchar_t*转char*

    #include <cstdio>       //for swprintf,sprintf 
    #include <cstdlib>      //for mbstowidechar, widechartombs函数
    #include <Windows.h>    //for wsprintf, MultiByteToWideChar,WideCharToMultiByte
    #include <atlconv.h>    //for A2W(),W2A()
    #include <atlstr.h>     //for CString
    #include <iostream>     //for std::locale
    #include <string>
    #include <locale.h>
    
    using std::cout;
    using std::wcout;
    using std::endl;
    using std::string;
    using std::wstring;
    
    #pragma warning(disable : 4996)
    
    int main(void)
    {
        wchar_t wbuf[] = L"我是韩长鸣haizeiwanghancm";
        char buf[100];
        //1. CRT的sprintf()函数
    
        MessageBoxW(NULL, L"sprintf函数", nullptr, 0);
        //使用系统locale
        setlocale(LC_CTYPE, "");
        //locale oldlocale = locale::global(locale(""));
        sprintf(buf, "%S", wbuf);
        MessageBoxA(NULL, buf, NULL, 0);
        //locale::global(oldlocale);
    
        //2. windows的wsprintfA()
        //%S: 宽字符
        MessageBoxW(NULL, L"wsprintfA函数", nullptr, 0);
        wsprintfA(buf, "%S", wbuf);
        MessageBoxA(NULL, buf, NULL, 0);
        // 也直接使用带W的函数,
        MessageBoxW(NULL, wbuf, NULL, 0);
    
        //3. Windows的WideCharToMultiByte(): 都没问题
    
        MessageBoxW(NULL, L"WideCharToMultiByte()函数", nullptr, 0);
    
        //返回需要的字节数目(包括结尾'')
        int len = WideCharToMultiByte(
            CP_ACP,      //多字节相关的代码页
            0,           //额外控制,影响变音符号,一般设为0
            wbuf,         //wchar缓冲区
            -1,          //wchar字符个数,-1函数自动判断长度
            NULL,        //char缓冲区
            0,           //char缓冲区最大字节数,传入0:不执行转换,返回需要的宽字节数目(包括结尾'')
            nullptr,     //遇到不能转换的字符时的替换字符,nullptr:代表使用系统默认字符,通常?
            nullptr      //表明是否转换成功:TRUE:有不能转换的字符,FALSE:成功
            );         
    
        char *buf2 = new char[len];
        if (wbuf == nullptr) {
        return 0;
        }
    
        WideCharToMultiByte(CP_ACP, 0, wbuf, -1, buf2, len, nullptr, nullptr);
        MessageBoxA(NULL, buf2, NULL, 0);
        delete[] buf2;
    
        //4. CTR的mbstowcs()函数
        MessageBoxW(NULL, L"wcstombs函数", nullptr, 0);
        setlocale(LC_CTYPE, "");
        //locale old_loc = locale::global(locale(""));
        wcstombs(buf, wbuf, sizeof(wbuf));
        MessageBoxA(nullptr, buf, nullptr, 0);
        //locale::global(old_loc);
    
        //5. ATL的A2W在MFC中也可以
        MessageBoxW(nullptr, L"W2A()", nullptr, 0);
        USES_CONVERSION;
        MessageBoxA(nullptr, W2A(wbuf), nullptr, 0);
    
        //6. ATL的CStringA, CStringA再operator const char*
        MessageBoxW(nullptr, L"CString方式", nullptr, 0);
        CStringA str = wbuf;
        MessageBoxA(nullptr, str, nullptr, 0);
    
        //7. wstring转char*
        wstring str1 = L"wstring方式, jsfoej韩长鸣fiok";
        string ch(str1.size(), 0);
        setlocale(LC_CTYPE, "");
        wcstombs(&ch[0], str1.c_str(), str1.size());
        MessageBoxA(nullptr, ch.c_str(), nullptr, 0);
    
        //8. CStringW转char*
        CStringW CStr = "CStringW方式jsofj韩长鸣eof";
        CStringA AStr = CStr;
        MessageBoxA(nullptr, AStr, nullptr, 0);
    
        //9. CStringW转wstring,直接赋值
        CStringW wstr(L"韩长鸣sjfo");
        wstring ws = wstr;
        wcout << ws << endl;
    
        //10. wstring转CStringW, CStringW = wstring.c_str();
    
        //11. CStringW转string: CStringA = CStringW; string = CStringA;
    
        //12. wstring转CStringA: CStringW = wstring.cstr(); CStringA = CStringW;
    
        return 0;
    }
  • 相关阅读:
    zhuanzai
    安装 Python
    解决删除/升级Python导致Ubuuntu无法进入桌面的问题
    硬盘安装ubuntu120.04分区方案
    ping: sendto: Network is unreachable
    电脑系统右键反应很慢问题
    安装Ubuntu下的开发工具
    设置文件夹为超级权限
    Ubuntu12.04配置静态ip地址
    马拉车算法
  • 原文地址:https://www.cnblogs.com/hancm/p/4123652.html
Copyright © 2020-2023  润新知