如何:在各种字符串类型之间进行转换

// 从 char *(C风格字符串)转换到其它字符串类型
// convert_from_char.cpp
// compile with: /clr /link comsuppw.lib

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"

    using namespace std;
    using namespace System;

    int main()
    {
        //初始化C风格字符串
        char *orig = "Hello, World!";
        cout << orig << " (char *)" << endl;

        //宽字符串长度
        size_t newsize = strlen(orig) + 1;
        //在堆上分配一个宽字符串数组
        wchar_t * wcstring = new wchar_t[newsize];

        //从 char* 类型字符串转换到 wchar_t* 类型字符串.
        size_t convertedChars = 0;
        mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE);
        //输出转换后结果.
        wcout << wcstring << _T(" (wchar_t *)") << endl;

        //转换 char* 字符串转换到 CStringA (多字节CString).
        CStringA cstringa(orig);
        cstringa += " (CStringA)";
        cout << cstringa << endl;

        //转换 char* 字符串转换到 CStringW (宽字节CString).
        CStringW cstring(orig);
        cstring += " (CStringW)";
        //使用wcout输出宽字节字符串
        wcout << (LPCTSTR)cstring << endl;

        //转换 char* 字符串转换到 basic_string (STL字符串类型).
        string basicstring(orig);
        basicstring += " (basic_string)";
        cout << basicstring << endl;

        //转换 char* 字符串转换到 System::String (.NET字符串).
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }
// 从 wchar_t *(宽字节字符串)转换到其它字符串类型
// convert_from_wchar_t.cpp
// compile with: /clr /link comsuppw.lib

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"

    using namespace std;
    using namespace System;

    int main()
    {
        //初始化宽字节字符串
        wchar_t *orig = _T("Hello, World!");
        wcout << orig << _T(" (wchar_t *)") << endl;

        //字符串长度
        size_t origsize = wcslen(orig) + 1;
        size_t convertedChars = 0;

        //添加输出类型标记.
        char strConcat[] = " (char *)";
        size_t strConcatsize = (strlen( strConcat ) + 1)*2;

        //宽字节字符串每个字符占2字节,包括结尾0
        const size_t newsize = origsize*2;
        //在堆上分配内存用于存储转换后的字符串
        char *nstring = new char[newsize+strConcatsize];

        //转换复制
        wcstombs_s(&convertedChars, nstring, newsize, orig, _TRUNCATE);
        //添加字符类型标识.
        _mbscat_s((unsigned char*)nstring, newsize+strConcatsize, (unsigned char*)strConcat);
        //输出结果
        cout << nstring << endl;

        //从 wchar_t 字符串转换到多字节 CStringA,
        CStringA cstringa(orig);
        cstringa += " (CStringA)";
        cout << cstringa << endl;

        //从wchar_t 字符串转换到 宽字符 CStringW
        CStringW cstring(orig);
        cstring += " (CStringW)";
        //使用宽字符 wcout 输出结果
        wcout << (LPCTSTR)cstring << endl;

        //从 wchar_t 字符串 转换到 STL basic_string
        wstring basicstring(orig);
        basicstring += _T(" (basic_string)");
        wcout << basicstring << endl;

        //从 wchar_t 字符串转换到.NET System::String string
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }
// 从 CString(MFC字符串)转换到其它字符串类型
// convert_from_cstring.cpp
// compile with: /clr /link comsuppw.lib

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"

    using namespace std;
    using namespace System;

    int main()
    {
        //初始化多字节CString.
        CStringA origa("Hello, World!");
        cout << origa << " (CStringA)" << endl;
        //初始化宽字节CString.
        CStringW origw("Hello, World!");
        wcout << (LPCTSTR)origw << _T(" (CStringW)") << endl;

        //转换 CStringA string 到  char* string
        const size_t newsizea = (origa.GetLength() + 1);
        char *nstringa = new char[newsizea];
        strcpy_s(nstringa, newsizea, origa);
        cout << nstringa << " (char *)" << endl;

        //转换CStringW string 到 char* string
        const size_t newsizew = (origw.GetLength() + 1)*2;
        char *nstringw = new char[newsizew];
        size_t convertedCharsw = 0;
        wcstombs_s(&convertedCharsw, nstringw, newsizew, origw, _TRUNCATE );
        cout << nstringw << " (char *)" << endl;

        //转换 CStringA 到 wchar_t*
        size_t convertedCharsa = 0;
        wchar_t *wcstring = new wchar_t[newsizea];
        mbstowcs_s(&convertedCharsa, wcstring, newsizea, origa, _TRUNCATE);
        wcout << wcstring << _T(" (wchar_t *)") << endl;

        //转换 CStringW 到 wchar_t* string
        wchar_t *n2stringw = new wchar_t[newsizew];
        wcscpy_s( n2stringw, newsizew, origw );
        wcout << n2stringw << _T(" (wchar_t *)") << endl;

        //转换 CStringA 到 basic_string string.
        string basicstring(origa);
        basicstring += " (basic_string)";
        cout << basicstring << endl;

        //转换 CStringW 到 basic_string string.
        wstring basicstringw(origw);
        basicstringw += _T(" (basic_string)");
        wcout << basicstringw << endl;

        //转换 CStringA 到 System::String.
        String ^systemstring = gcnew String(origa);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
        //转换 CStringW 到 System::String.
        String ^systemstringw = gcnew String(origw);
        systemstringw += " (System::String)";
        Console::WriteLine("{0}", systemstringw);
        delete systemstringw;
    }
// 从 basic_string (STL字符串)转换到其它字符串类型
// convert_from_basic_string.cpp
// compile with: /clr /link comsuppw.lib

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"

    using namespace std;
    using namespace System;

    int main()
    {
        //初始化 basic_string string.
        string orig("Hello, World!");
        cout << orig << " (basic_string)" << endl;

        //转换宽字节 basic_string string 到多字节 char* string. 
        const size_t newsize = (strlen(orig.c_str()) + 1)*2;
        char *nstring = new char[newsize];
        strcpy_s(nstring, newsize, orig.c_str());
        cout << nstring << " (char *)" << endl;

        //转换 basic_string string 到宽字节 wchar_t* string. 
        //需要先转换到 char* string
        const size_t newsizew = strlen(orig.c_str()) + 1;
        size_t convertedChars = 0;
        wchar_t *wcstring = new wchar_t[newsizew];
        mbstowcs_s(&convertedChars, wcstring, newsizew, orig.c_str(), _TRUNCATE);
        wcout << wcstring << _T(" (wchar_t *)") << endl;

        //转换 basic_string string 到多字节 CStringA string.
        CStringA cstring(orig.c_str());
        cstring += " (CStringA)";
        cout << cstring << endl;

        //转换 basic_string string 到宽字节 CStringW string.
        CStringW cstringw(orig.c_str());
        cstringw += _T(" (CStringW)");
        wcout << (LPCTSTR)cstringw << endl;

        //转换 basic_string string 到 System::String
        String ^systemstring = gcnew String(orig.c_str());
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }
// 从  (Unicode) System::String (.NET字符串)转换到其它字符串类型
// convert_from_system_string.cpp
// compile with: /clr /link comsuppw.lib

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    #include "vcclr.h"

    using namespace std;
    using namespace System;
    using namespace System::Runtime::InteropServices;

    int main()
    {
        //初始化 System::String.
        String ^orig = gcnew String("Hello, World!");
        Console::WriteLine("{0} (System::String)", orig);

        // Obtain a pointer to the System::String in order to
        // first lock memory into place, so that the
        // Garbage Collector (GC) cannot move that object
        // while we call native functions.
        pin_ptr<const wchar_t> wch = PtrToStringChars(orig);

        //转换 system string 到多字节 char* string.
        size_t origsize = wcslen(wch) + 1;
        const size_t newsize = origsize*2;
        size_t convertedChars = 0;
        char *nstring = new char[newsize];
        wcstombs_s(&convertedChars, nstring, newsize, wch, _TRUNCATE);
        cout << nstring << " (char *)" << endl;

        //转换宽字节 system string 到宽字节 wchar_t* string.
        const size_t newsizew = origsize;
        wchar_t *wcstring = new wchar_t[newsizew];
        wcscpy_s(wcstring, newsizew, wch);
        wcout << wcstring << _T(" (wchar_t *)") << endl;

        //转换宽字节 System::String 到多字节 CStringA string.
        CStringA cstring(wch);
        cstring += " (CStringA)";
        cout << cstring << endl;

        //转换宽字节 System::String 到宽字节 CStringW string.
        CStringW cstringw(wch);
        cstringw += " (CStringW)";
        wcout << (LPCTSTR)cstringw << endl;

        //转换宽字节 System::String 到宽字节 basic_string.
        wstring basicstring(wch);
        basicstring += _T(" (basic_string)");
        wcout << basicstring << endl;

        delete orig;
    }

Strings: https://msdn.microsoft.com/en-us/library/windows/hardware/ff563884(v=vs.85).aspx
数据转换: https://msdn.microsoft.com/zh-cn/library/0heszx3w.aspx

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值