Convert Platform::String to std::string
c#, c++, cocos2d-x, windows-phone-8, winrt-component
Solution
Edit: see this answer for a better portable solution.
The problem is that `std::string` only holds 8-bit character data and your `Platform::String^` holds Unicode data. Windows provides functions `WideCharToMultiByte` and `MultiByteToWideChar` to convert back and forth:
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
}
Problem
I am getting `String^` which Contains some Indian language characters in a callback from C# Component in my C++ WinRT Component in a Cocos2dx game for Windows Phone 8 project. Whenever I convert it to `std::string` the Hindi and other characters turn in to garbage characters. I'm not able to find why this is happening. Here is a sample code and I have just defined `Platform::String^` here but consider it's passed to `C++ WinRT Component` from C# Component ``` String^ str = L"विकास, વિકાસ, ਵਿਕਾਸ, Vikas"; std::wstring wsstr(str->Data()); std::string res(wsstr.begin(), wsstr.end()); ```