将 Platform::String 转换为 std::string

Vik*_*dar 4 c# c++ cocos2d-x windows-phone-8 winrt-component

我在String^Windows Phone 8 项目的 Cocos2dx 游戏中从我的 C++ WinRT 组件中的 C# 组件回调中得到which包含一些印度语言字符。

每当我将其转换为std::string印地语时,其他字符都会变成垃圾字符。我无法找到为什么会发生这种情况。

这是一个示例代码,我刚刚Platform::String^在此处定义,但考虑它是C++ WinRT Component从 C# 组件传递给的

String^ str = L"?????, ?????, ?????, Vikas";
std::wstring wsstr(str->Data());
std::string res(wsstr.begin(), wsstr.end());
Run Code Online (Sandbox Code Playgroud)

Pet*_*SFT 5

编辑:请参阅此答案以获得更好的便携式解决方案。

问题是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
}
Run Code Online (Sandbox Code Playgroud)