Как преобразовать платформу:: 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];
}