Перевод System::String в char*

Возникла задача перевести в .Net-приложении строку из типа String в родной C-шный char*.
У std::string для этих целей есть метод c_str (), поэтому проблем с ним не возникает. Но System::String подобных методов не имеет, что усложняет задачу.

Походив по интернету нашел несколько вариантов решения этой проблемы.

1. Функция PtrToSringChars

#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str = PtrToStringChars(str);
wprintf(str);

Недостаток — возвращается не чистый char, а const __wchar_t __pin. Хотя это наверное легко решается простым кастованием.

2. Функция StringToHGlobalAnsi

using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str);
Marshal::FreeHGlobal(str);

Недостаток — возвращается строка в ANSI, что будет со строкой в UTF-8 — неизвестно.

3. Использование в качестве посредника CString

#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str2(str);
char* buf = str2.GetBuffer(0);
printf(buf);

Недостаток — необходимо подключать к проекту поддержку ATL.

4. Маршалинг

#include <msclr/marshal.h>
using namespace msclr::interop;
marshal_context ^ context = gcnew marshal_context();
const char* str2 = context->marshal_as<const char*>(str);
puts(str2);
delete context;

Недостаток — не работает с Visual C++ 2003.

5. Посимвольное копирование

System::String* temp = new System::String("Hello World!");
char* myString = new char[temp->Length];
for(int i = 0; i < temp->Length; i++)
 myString[i] = temp-<get_Chars(i);

Недостаток — не элегантно.

6. Перекодирование в необходимую кодировку

String * s = "Hello World!";
char utf8 __gc[] = Encoding::UTF8->GetBytes(s);
char __pin * value = &utf8[0];

Для меня самым подходящим оказался вариант №2.
Если кто-то знает еще методы перевода из System::String в char* — предлагайте.

Поблагодарить автора

2 Responses to Перевод System::String в char*

  1. А как преобразовать обратно из char в string?

    P.S. Огромное спасибо за статью!

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>