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

我正在获取String^ ,它包含一些印度语言字符,来自C#WinCT组件中C#Component的回调,用于Windows Phone 8项目的Cocos2dx游戏。

每当我将它转换为std::string ,印地语和其他字符就会变成垃圾字符。 我无法找到为什么会这样。

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

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

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

问题是std::string只保存8位字符数据,而Platform::String^保存Unicode数据。 Windows提供了WideCharToMultiByteMultiByteToWideChar函数来回转换:

 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(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(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 *?