此示例演示如何从 char * 转换为上面列出的其他字符串类型。 char * 字符串(也称为 C 样式字符串)使用 null 字符指示字符串的末尾。 C 样式字符串通常每个字符需要一个字节,但也可以使用两个字节。 在下面的示例中,char * 字符串有时称为多字节字符字符串,因为该字符串数据是从 Unicode 字符串转换得到的。 可对 char * 字符串执行单字节和多字节字符 (MBCS) 函数运算
// 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() { // Create and display a C style string, and then use it // to create different kinds of strings. char *orig = "Hello, World!"; cout << orig << " (char *)" << endl; // newsize describes the length of the // wchar_t string called wcstring in terms of the number // of wide characters, not the number of bytes. size_t newsize = strlen(orig) + 1; // The following creates a buffer large enough to contain // the exact number of characters in the original string // in the new format. If you want to add more characters // to the end of the string, increase the value of newsize // to increase the size of the buffer. wchar_t * wcstring = new wchar_t[newsize]; // Convert char* string to a wchar_t* string. size_t convertedChars = 0; mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE); // Display the result and indicate the type of string that it is. wcout << wcstring << _T(" (wchar_t *)") << endl; // Convert the C style string to a _bstr_t string. _bstr_t bstrt(orig); // Append the type of string to the new string // and then display the result. bstrt += " (_bstr_t)"; cout << bstrt << endl; // Convert the C style string to a CComBSTR string. CComBSTR ccombstr(orig); if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK) { CW2A printstr(ccombstr); cout << printstr << endl; } // Convert the C style string to a CstringA and display it. CStringA cstringa(orig); cstringa += " (CStringA)"; cout << cstringa << endl; // Convert the C style string to a CStringW and display it. CStringW cstring(orig); cstring += " (CStringW)"; // To display a CStringW correctly, use wcout and cast cstring // to (LPCTSTR). wcout << (LPCTSTR)cstring << endl; // Convert the C style string to a basic_string and display it. string basicstring(orig); basicstring += " (basic_string)"; cout << basicstring << endl; // Convert the C style string to a System::String and display it. 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! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String)
此示例演示如何从 wchar_t * 转换为上面列出的其他字符串类型。 包括 wchar_t * 在内的一些字符串类型可实现宽字符格式。 若要在多字节和宽字符格式之间转换字符串,则可以使用单个函数调用(如 mbstowcs_s),也可以使用针对类的构造函数调用(如 CStringA)。
// 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() { // Create a string of wide characters, display it, and then // use this string to create other types of strings. wchar_t *orig = _T("Hello, World!"); wcout << orig << _T(" (wchar_t *)") << endl; // Convert the wchar_t string to a char* string. Record //.the length of the original string and add 1 to it to //.account for the terminating null character. size_t origsize = wcslen(orig) + 1; size_t convertedChars = 0; // Use a multibyte string to append the type of string // to the new string before displaying the result. char strConcat[] = " (char *)"; size_t strConcatsize = (strlen( strConcat ) + 1)*2; // Allocate two bytes in the multibyte output string for every wide // character in the input string (including a wide character // null). Because a multibyte character can be one or two bytes, // you should allot two bytes for each character. Having extra // space for the new string is not an error, but having // insufficient space is a potential security problem. const size_t newsize = origsize*2; // The new string will contain a converted copy of the original // string plus the type of string appended to it. char *nstring = new char[newsize+strConcatsize]; // Put a copy of the converted string into nstring wcstombs_s(&convertedChars, nstring, newsize, orig, _TRUNCATE); // append the type of string to the new string. _mbscat_s((unsigned char*)nstring, newsize+strConcatsize, (unsigned char*)strConcat); // Display the result. cout << nstring << endl; // Convert a wchar_t to a _bstr_t string and display it. _bstr_t bstrt(orig); bstrt += " (_bstr_t)"; cout << bstrt << endl; // Convert the wchar_t string to a BSTR wide character string // by using the ATL CComBSTR wrapper class for BSTR strings. // Then display the result. CComBSTR ccombstr(orig); if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK) { // CW2A converts the string in ccombstr to a multibyte // string in printstr, used here for display output. CW2A printstr(ccombstr); cout << printstr << endl; // The following line of code is an easier way to // display wide character strings: // wcout << (LPCTSTR) ccombstr << endl; } // Convert a wide wchar_t string to a multibyte CStringA, // append the type of string to it, and display the result. CStringA cstringa(orig); cstringa += " (CStringA)"; cout << cstringa << endl; // Convert a wide character wchar_t string to a wide // character CStringW string and append the type of string to it CStringW cstring(orig); cstring += " (CStringW)"; // To display a CStringW correctly, use wcout and cast cstring // to (LPCTSTR). wcout << (LPCTSTR)cstring << endl; // Convert the wide character wchar_t string to a // basic_string, append the type of string to it, and // display the result. wstring basicstring(orig); basicstring += _T(" (basic_string)"); wcout << basicstring << endl; // Convert a wide character wchar_t string to a // System::String string, append the type of string to it, // and display the result. 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! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String)
此示例演示如何从 _bstr_t 转换为上面列出的其他字符串类型。 _bstr_t 对象是一种封装宽字符 BSTR 字符串的方法。 BSTR 字符串具有长度值且不使用 null 字符终止字符串,但所要转换到的目标字符串类型可能需要终止 null。
// 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() { // Create a _bstr_t string, display the result, and indicate the // type of string that it is. _bstr_t orig("Hello, World!"); wcout << orig << " (_bstr_t)" << endl; // Convert the wide character _bstr_t string to a C style // string. To be safe, allocate two bytes for each character // in the char* string, including the terminating null. const size_t newsize = (orig.length()+1)*2; char *nstring = new char[newsize]; // Uses the _bstr_t operator (char *) to obtain a null // terminated string from the _bstr_t object for // nstring. strcpy_s(nstring, newsize, (char *)orig); strcat_s(nstring, newsize, " (char *)"); cout << nstring << endl; // Prepare the type of string to append to the result. wchar_t strConcat[] = _T(" (wchar_t *)"); size_t strConcatLen = wcslen(strConcat) + 1; // Convert a _bstr_t to a wchar_t* string. const size_t widesize = orig.length()+ strConcatLen; wchar_t *wcstring = new wchar_t[newsize]; wcscpy_s(wcstring, widesize, (wchar_t *)orig); wcscat_s(wcstring, widesize, strConcat); wcout << wcstring << endl; // Convert a _bstr_t string to a CComBSTR string. CComBSTR ccombstr((char *)orig); if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK) { CW2A printstr(ccombstr); cout << printstr << endl; } // Convert a _bstr_t to a CStringA string. CStringA cstringa(orig.GetBSTR()); cstringa += " (CStringA)"; cout << cstringa << endl; // Convert a _bstr_t to a CStringW string. CStringW cstring(orig.GetBSTR()); cstring += " (CStringW)"; // To display a cstring correctly, use wcout and // "cast" the cstring to (LPCTSTR). wcout << (LPCTSTR)cstring << endl; // Convert the _bstr_t to a basic_string. string basicstring((char *)orig); basicstring += " (basic_string)"; cout << basicstring << endl; // Convert the _bstr_t to a System::String. String ^systemstring = gcnew String((char *)orig); systemstring += " (System::String)"; Console::WriteLine("{0}", systemstring); delete systemstring; }
Output
Hello, World! (_bstr_t) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String)说明
此示例演示如何从 CComBSTR 转换为上面列出的其他字符串类型。 与 _bstr_t 一样,CComBSTR 对象是一种封装宽字符 BSTR 字符串的方法。 BSTR 字符串具有长度值且不使用 null 字符终止字符串,但所要转换到的目标字符串类型可能需要终止 null。
代码
// 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() { // Create and initialize a BSTR string by using a CComBSTR object. CComBSTR orig("Hello, World!"); // Convert the BSTR into a multibyte string, display the result, // and indicate the type of string that it is. CW2A printstr(orig); cout << printstr << " (CComBSTR)" << endl; // Convert a wide character CComBSTR string to a // regular multibyte char* string. Allocate enough space // in the new string for the largest possible result, // including space for a terminating null. const size_t newsize = (orig.Length()+1)*2; char *nstring = new char[newsize]; // Create a string conversion object, copy the result to // the new char* string, and display the result. CW2A tmpstr1(orig); strcpy_s(nstring, newsize, tmpstr1); cout << nstring << " (char *)" << endl; // Prepare the type of string to append to the result. wchar_t strConcat[] = _T(" (wchar_t *)"); size_t strConcatLen = wcslen(strConcat) + 1; // Convert a wide character CComBSTR string to a wchar_t*. // The code first determines the length of the converted string // plus the length of the appended type of string, then // prepares the final wchar_t string for display. const size_t widesize = orig.Length()+ strConcatLen; wchar_t *wcstring = new wchar_t[widesize]; wcscpy_s(wcstring, widesize, orig); wcscat_s(wcstring, widesize, strConcat); // Display the result. Unlike CStringW, a wchar_t does not need // a cast to (LPCTSTR) with wcout. wcout << wcstring << endl; // Convert a wide character CComBSTR to a wide character _bstr_t, // append the type of string to it, and display the result. _bstr_t bstrt(orig); bstrt += " (_bstr_t)"; cout << bstrt << endl; // Convert a wide character CComBSTR to a multibyte CStringA, // append the type of string to it, and display the result. CStringA cstringa(orig); cstringa += " (CStringA)"; cout << cstringa << endl; // Convert a wide character CComBSTR to a wide character CStringW. CStringW cstring(orig); cstring += " (CStringW)"; // To display a cstring correctly, use wcout and cast cstring // to (LPCTSTR). wcout << (LPCTSTR)cstring << endl; // Convert a wide character CComBSTR to a wide character // basic_string. wstring basicstring(orig); basicstring += _T(" (basic_string)"); wcout << basicstring << endl; // Convert a wide character CComBSTR to a System::String. String ^systemstring = gcnew String(orig); systemstring += " (System::String)"; Console::WriteLine("{0}", systemstring); delete systemstring; }Output
Hello, World! (CComBSTR) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String)说明
此示例演示如何从 CString 转换为上面列出的其他字符串类型。 CString 基于 TCHAR 数据类型,而后者又依赖于是否定义了 _UNICODE 符号。 如果未定义 _UNICODE,则TCHAR 定义为 char 且 CString 包含一个多字节字符字符串;如果定义了 _UNICODE,则 TCHAR 定义为 wchar_t 且 CString 包含一个宽字符字符串。
CStringA 是 CString 的多字节字符串的始终版本;CStringW 是宽字符字符串的唯一版本。 CStringA 和 CStringW 都不使用 _UNICODE 确定它们应采用的编译方式。 此示例使用 CStringA 和 CStringW 明确指定缓冲区大小分配和输出处理中的一些细微差异。
代码
// 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() { // Set up a multibyte CStringA string. CStringA origa("Hello, World!"); cout << origa << " (CStringA)" << endl; // Set up a wide character CStringW string. CStringW origw("Hello, World!"); wcout << (LPCTSTR)origw << _T(" (CStringW)") << endl; // Convert to a char* string from CStringA string // and display the result. const size_t newsizea = (origa.GetLength() + 1); char *nstringa = new char[newsizea]; strcpy_s(nstringa, newsizea, origa); cout << nstringa << " (char *)" << endl; // Convert to a char* string from a wide character // CStringW string. To be safe, we allocate two bytes for each // character in the original string, including the terminating // null. 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; // Convert to a wchar_t* from CStringA size_t convertedCharsa = 0; wchar_t *wcstring = new wchar_t[newsizea]; mbstowcs_s(&convertedCharsa, wcstring, newsizea, origa, _TRUNCATE); wcout << wcstring << _T(" (wchar_t *)") << endl; // Convert to a wide character wchar_t* string from // a wide character CStringW string. wchar_t *n2stringw = new wchar_t[newsizew]; wcscpy_s( n2stringw, newsizew, origw ); wcout << n2stringw << _T(" (wchar_t *)") << endl; // Convert to a wide character _bstr_t string from // a multibyte CStringA string. _bstr_t bstrt(origa); bstrt += _T(" (_bstr_t)"); wcout << bstrt << endl; // Convert to a wide character_bstr_t string from // a wide character CStringW string. bstr_t bstrtw(origw); bstrtw += " (_bstr_t)"; wcout << bstrtw << endl; // Convert to a wide character CComBSTR string from // a multibyte character CStringA string. CComBSTR ccombstr(origa); if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK) { // Convert the wide character string to multibyte // for printing. CW2A printstr(ccombstr); cout << printstr << endl; } // Convert to a wide character CComBSTR string from // a wide character CStringW string. CComBSTR ccombstrw(origw); // Append the type of string to it, and display the result. if (ccombstrw.Append(_T(" (CComBSTR)")) == S_OK) { CW2A printstrw(ccombstrw); wcout << printstrw << endl; } // Convert a multibyte character CStringA to a // multibyte version of a basic_string string. string basicstring(origa); basicstring += " (basic_string)"; cout << basicstring << endl; // Convert a wide character CStringW to a // wide character version of a basic_string // string. wstring basicstringw(origw); basicstringw += _T(" (basic_string)"); wcout << basicstringw << endl; // Convert a multibyte character CStringA to a // System::String. String ^systemstring = gcnew String(origa); systemstring += " (System::String)"; Console::WriteLine("{0}", systemstring); delete systemstring;说明
此示例演示如何从宽字符 (Unicode) [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() { // Set up a System::String and display the result. 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); // Make a copy of the system string as a multibyte // char* string. Allocate two bytes in the multibyte // output string for every wide character in the input // string, including space for a terminating null. 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; // Convert a wide character system string to a // wide character 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; // Convert a wide character system string to a // wide character _bstr_t string. _bstr_t bstrt(wch); bstrt += " (_bstr_t)"; cout << bstrt << endl; // Convert a wide character system string // to a wide character CComBSTR string. CComBSTR ccombstr(wch); if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK) { // Make a multibyte copy of the CComBSTR string // and display the result. CW2A printstr(ccombstr); cout << printstr << endl; } // Convert a wide character System::String to // a multibyte CStringA string. CStringA cstring(wch); cstring += " (CStringA)"; cout << cstring << endl; // Convert a wide character System::String to // a wide character CStringW string. CStringW cstringw(wch); cstringw += " (CStringW)"; wcout << (LPCTSTR)cstringw << endl; // Convert a wide character System::String to // a wide character basic_string. wstring basicstring(wch); basicstring += _T(" (basic_string)"); wcout << basicstring << endl; delete orig; }Output
Hello, World! (System::String) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string)