Преобразовать платформу::String в std::string

Я получаю String^ который содержит некоторые символы индийского языка в обратном вызове из компонента C# в моем компоненте C++ WinRT в игре Cocos2dx для проекта Windows Phone 8.

Всякий раз, когда я конвертирую это в std::string хинди и другие персонажи превращаются в мусорных персонажей. Я не могу понять, почему это происходит.

Вот пример кода, и я только что определил Platform::String^ здесь, но учтите, что это передано C++ WinRT Component из компонента C#

String^ str = L"विकास, વિકાસ, ਵਿਕਾਸ, Vikas";
std::wstring wsstr(str->Data());
std::string res(wsstr.begin(), wsstr.end());

2 ответа

Решение

Изменить: см. Этот ответ для лучшего портативного решения.

Проблема в том, что std::string содержит только 8-битные символьные данные и ваш Platform::String^ содержит данные Unicode. Windows предоставляет функции WideCharToMultiByte а также MultiByteToWideChar конвертировать туда и обратно:

std::string make_string(const std::wstring& wstring)
{
  auto wideData = wstring.c_str();
  int bufferSize = WideCharToMultiByte(CP_UTF8, 0, wideData, -1, nullptr, 0, NULL, NULL);
  auto utf8 = std::make_unique<char[]>(bufferSize);
  if (0 == WideCharToMultiByte(CP_UTF8, 0, wideData, -1, utf8.get(), bufferSize, NULL, NULL))
    throw std::exception("Can't convert string to UTF8");

  return std::string(utf8.get());
}

std::wstring make_wstring(const std::string& string)
{
  auto utf8Data = string.c_str();
  int bufferSize = MultiByteToWideChar(CP_UTF8, 0, utf8Data, -1, nullptr, 0);
  auto wide = std::make_unique<wchar_t[]>(bufferSize);
  if (0 == MultiByteToWideChar(CP_UTF8, 0, utf8Data, -1, wide.get(), bufferSize))
    throw std::exception("Can't convert string to Unicode");

  return std::wstring(wide.get());
}

void Test()
{
  Platform::String^ str = L"विकास, વિકાસ, ਵਿਕਾਸ, Vikas";
  std::wstring wsstr(str->Data());
  auto utf8Str = make_string(wsstr); // UTF8-encoded text
  wsstr = make_wstring(utf8Str); // same as original text
}

С C++ вы можете конвертировать из Platform::String в std::string со следующим кодом:

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

Ссылка: Как конвертировать Platform::String в char*?

Другие вопросы по тегам