Как преобразовать платформу:: String в char *?

Как мне преобразовать содержимое платформы:: String, которое будет использоваться функциями, которые ожидают строку на основе char *? Я предполагаю, что WinRT предоставляет вспомогательные функции для этого, но я просто не могу их найти.

Спасибо!

Ответы

Ответ 1

Platform::String::Data() вернет символ wchar_t const*, указывающий на содержимое строки (аналогично std::wstring::c_str()). Platform::String представляет неизменяемую строку, поэтому нет доступа для доступа к wchar_t*. Вам нужно будет скопировать его содержимое, например. в std::wstring, чтобы внести изменения.

Нет прямого способа получить char* или char const*, потому что Platform::String использует широкие символы (все приложения стиля Metro - это приложения Unicode). Вы можете преобразовать в multibyte с помощью WideCharToMultiByte.

Ответ 2

Вот очень простой способ сделать это в коде без необходимости беспокоиться о длинах буфера. Используйте это решение только в том случае, если вы уверены, что имеете дело с ASCII:

Platform::String^ fooRT = "aoeu";
std::wstring fooW(fooRT->Begin());
std::string fooA(fooW.begin(), fooW.end());
const char* charStr = fooA.c_str();

Имейте в виду, что в этом примере char* находится в стеке и уйдет, как только он покинет область действия

Ответ 3

Вы не должны накладывать широкий символ на char, вы будете манипулировать языками, используя более одного байта на символ, например. Китайский. Вот правильный метод.

#include <cvt/wstring>
#include <codecvt>

Platform::String^ fooRT = "foo";
stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
std::string stringUtf8 = convert.to_bytes(fooRT->Data());
const char* rawCstring = stringUtf8.c_str();

Ответ 4

Решение с использованием wcstombs:

Platform::String^ platform_string = p_e->Uri->AbsoluteUri;
const wchar_t* wide_chars =  platform_string->Data();
char chars[512];
wcstombs(chars, wide_chars, 512);

Ответ 5

Там метод String::Data возвращает const char16*, который является строкой unicode.

Преобразование из юникода в ascii или что угодно, т.е. char16* в char*, - это другое дело. Вероятно, вам это не нужно, так как большинство методов имеют свои версии wchar в наши дни.

Ответ 6

Если вы похожи на меня, вы хотите получить полный исходный код, вот что:

Platform::String^ Path = "MyPath";
const wchar_t *W = Path->Data();

int Size = wcslen( W );
char *CString= new char[Size + 1];
CString[ Size ] = 0;
for(int y=0;y<Size; y++)
{
    CString[y] = (char)W[y];
}