闻心阁

一蓑烟雨看苍生,半壶浊酒笑红尘

C++ 字符串类型转换(char *、wchar_t*、_bstr_t、CComBSTR、CString、basic_string 和 System.String)

2013-04-27 约 7 分钟读完 搬砖秘籍

在C++中经常涉及字符串类型转换,VC++里面尤其严重,实在搞不通微软为什么要搞这么多的字符串类型,实在是纠结,这里做一个简单的小总结:

从 char * 转换

示例

说明

此示例演示如何从 char * 转换为上面列出的其他字符串类型。

// 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() { char *orig = "Hello, World!"; cout << orig << " (char *)" << endl;

// Convert to a wchar_t* size_t origsize = strlen(orig) + 1; const size_t newsize = 100; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); wcscat_s(wcstring, L" (wchar_t *)"); wcout << wcstring << endl;

// Convert to a _bstr_t _bstr_t bstrt(orig); bstrt += " (_bstr_t)"; cout << bstrt << endl;

// Convert to a CComBSTR CComBSTR ccombstr(orig); if (ccombstr.Append(L" (CComBSTR)") == S_OK) { CW2A printstr(ccombstr); cout << printstr << endl; }

// Convert to a CString CString cstring(orig); cstring += " (CString)"; cout << cstring << endl;

// Convert to a basic_string string basicstring(orig); basicstring += " (basic_string)"; cout << basicstring << endl;

// Convert to a System::String String ^systemstring = gcnew String(orig); systemstring += " (System::String)"; Console::WriteLine("{0}", systemstring); delete systemstring; }

输出

Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

从 wchar_t * 转换

示例

说明

此示例演示如何从 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 = L"Hello, World!";
 wcout << orig << L" (wchar_t *)" << endl;

 // Convert to a char*
 size_t origsize = wcslen(orig) + 1;
 const size_t newsize = 100;
 size_t convertedChars = 0;
 char nstring[newsize];
 wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE);
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a _bstr_t
 _bstr_t bstrt(orig);
 bstrt += " (_bstr_t)";
 cout << bstrt << endl;

 // Convert to a CComBSTR
 CComBSTR ccombstr(orig);
 if (ccombstr.Append(L" (CComBSTR)") == S_OK)
 {
 CW2A printstr(ccombstr);
 cout << printstr << endl;
 }

 // Convert to a CString
 CString cstring(orig);
 cstring += " (CString)";
 cout << cstring << endl;

 // Convert to a basic_string
 wstring basicstring(orig);
 basicstring += L" (basic_string)";
 wcout << basicstring << endl;

 // Convert to a System::String
 String ^systemstring = gcnew String(orig);
 systemstring += " (System::String)";
 Console::WriteLine("{0}", systemstring);
 delete systemstring;
}

输出

Hello, World! (wchar_t *)
Hello, World! (char *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

从 _bstr_t 转换

示例

说明

此示例演示如何从 _bstr_t 转换为上面列出的其他字符串类型。

// convert_from_bstr_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()
{
 _bstr_t orig("Hello, World!");
 wcout << orig << " (_bstr_t)" << endl;

 // Convert to a char*
 const size_t newsize = 100;
 char nstring[newsize];
 strcpy_s(nstring, (char *)orig);
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a wchar_t*
 wchar_t wcstring[newsize];
 wcscpy_s(wcstring, (wchar_t *)orig);
 wcscat_s(wcstring, L" (wchar_t *)");
 wcout << wcstring << endl;

 // Convert to a CComBSTR
 CComBSTR ccombstr((char *)orig);
 if (ccombstr.Append(L" (CComBSTR)") == S_OK)
 {
 CW2A printstr(ccombstr);
 cout << printstr << endl;
 }

 // Convert to a CString
 CString cstring((char *)orig);
 cstring += " (CString)";
 cout << cstring << endl;

 // Convert to a basic_string
 string basicstring((char *)orig);
 basicstring += " (basic_string)";
 cout << basicstring << endl;

 // Convert to a System::String
 String ^systemstring = gcnew String((char *)orig);
 systemstring += " (System::String)";
 Console::WriteLine("{0}", systemstring);
 delete systemstring;
}

输出

Hello, World! (_bstr_t)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

从 CComBSTR 转换

示例

说明

此示例演示如何从 CComBSTR 转换为上面列出的其他字符串类型。

// convert_from_ccombstr.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()
{
 CComBSTR orig("Hello, World!");
 CW2A printstr(orig);
 cout << printstr << " (CComBSTR)" << endl;

 // Convert to a char*
 const size_t newsize = 100;
 char nstring[newsize];
 CW2A tmpstr1(orig);
 strcpy_s(nstring, tmpstr1);
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a wchar_t*
 wchar_t wcstring[newsize];
 wcscpy_s(wcstring, orig);
 wcscat_s(wcstring, L" (wchar_t *)");
 wcout << wcstring << endl;

 // Convert to a _bstr_t
 _bstr_t bstrt(orig);
 bstrt += " (_bstr_t)";
 cout << bstrt << endl;

 // Convert to a CString
 CString cstring(orig);
 cstring += " (CString)";
 cout << cstring << endl;

 // Convert to a basic_string
 wstring basicstring(orig);
 basicstring += L" (basic_string)";
 wcout << basicstring << endl;

 // Convert to a System::String
 String ^systemstring = gcnew String(orig);
 systemstring += " (System::String)";
 Console::WriteLine("{0}", systemstring);
 delete systemstring;
}

输出

Hello, World! (CComBSTR)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CString)
Hello, World! (basic_string)
Hello, World! (System::String)

从 CString 转换

示例

说明

此示例演示如何从 CString 转换为上面列出的其他字符串类型。

// 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 orig("Hello, World!");
 wcout << orig << " (CString)" << endl;

 // Convert to a char*
 const size_t newsize = 100;
 char nstring[newsize];
 strcpy_s(nstring, orig);
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a wchar_t*
 // You must first convert to a char * for this to work.
 size_t origsize = strlen(orig) + 1;
 size_t convertedChars = 0;
 wchar_t wcstring[newsize];
 mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
 wcscat_s(wcstring, L" (wchar_t *)");
 wcout << wcstring << endl;

 // Convert to a _bstr_t
 _bstr_t bstrt(orig);
 bstrt += " (_bstr_t)";
 cout << bstrt << endl;

 // Convert to a CComBSTR
 CComBSTR ccombstr(orig);
 if (ccombstr.Append(L" (CComBSTR)") == S_OK)
 {
 CW2A printstr(ccombstr);
 cout << printstr << endl;
 }

 // Convert to a basic_string
 string basicstring(orig);
 basicstring += " (basic_string)";
 cout << basicstring << endl;

 // Convert to a System::String
 String ^systemstring = gcnew String(orig);
 systemstring += " (System::String)";
 Console::WriteLine("{0}", systemstring);
 delete systemstring;
}

输出

Hello, World! (CString)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (basic_string)
Hello, World! (System::String)

从 basic_string 转换

示例

说明

此示例演示如何从 basic_string 转换为上面列出的其他字符串类型。

// 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()
{
 string orig("Hello, World!");
 cout << orig << " (basic_string)" << endl;

 // Convert to a char*
 const size_t newsize = 100;
 char nstring[newsize];
 strcpy_s(nstring, orig.c_str());
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a wchar_t*
 // You must first convert to a char * for this to work.
 size_t origsize = strlen(orig.c_str()) + 1;
 size_t convertedChars = 0;
 wchar_t wcstring[newsize];
 mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
 wcscat_s(wcstring, L" (wchar_t *)");
 wcout << wcstring << endl;

 // Convert to a _bstr_t
 _bstr_t bstrt(orig.c_str());
 bstrt += " (_bstr_t)";
 cout << bstrt << endl;

 // Convert to a CComBSTR
 CComBSTR ccombstr(orig.c_str());
 if (ccombstr.Append(L" (CComBSTR)") == S_OK)
 {
 CW2A printstr(ccombstr);
 cout << printstr << endl;
 }

 // Convert to a CString
 CString cstring(orig.c_str());
 cstring += " (CString)";
 cout << cstring << endl;

 // Convert to a System::String
 String ^systemstring = gcnew String(orig.c_str());
 systemstring += " (System::String)";
 Console::WriteLine("{0}", systemstring);
 delete systemstring;
}

输出

Hello, World! (basic_string)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (System::String)

从 System::String 转换

示例

说明

此示例演示如何从 System.String 转换为上面列出的其他字符串类型。

// 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()
{
 String ^orig = gcnew String("Hello, World!");
 Console::WriteLine("{0} (System::String)", orig);

 pin_ptr<const wchar_t> wch = PtrToStringChars(orig);

 // Convert to a char*
 size_t origsize = wcslen(wch) + 1;
 const size_t newsize = 100;
 size_t convertedChars = 0;
 char nstring[newsize];
 wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
 strcat_s(nstring, " (char *)");
 cout << nstring << endl;

 // Convert to a wchar_t*
 wchar_t wcstring[newsize];
 wcscpy_s(wcstring, wch);
 wcscat_s(wcstring, L" (wchar_t *)");
 wcout << wcstring << endl;

 // Convert to a _bstr_t
 _bstr_t bstrt(wch);
 bstrt += " (_bstr_t)";
 cout << bstrt << endl;

 // Convert to a CComBSTR
 CComBSTR ccombstr(wch);
 if (ccombstr.Append(L" (CComBSTR)") == S_OK)
 {
 CW2A printstr(ccombstr);
 cout << printstr << endl;
 }

 // Convert to a CString
 CString cstring(wch);
 cstring += " (CString)";
 cout << cstring << endl;

 // Convert to a basic_string
 wstring basicstring(wch);
 basicstring += L" (basic_string)";
 wcout << basicstring << endl;

 delete orig;
}

输出

Hello, World! (System::String)
Hello, World! (char *)
Hello, World! (wchar_t *)
Hello, World! (_bstr_t)
Hello, World! (CComBSTR)
Hello, World! (CString)
Hello, World! (basic_string)
转自:http://blog.donews.com/keo321/?p=1583425