Convert Platform::String to std::string

前端 未结 2 1448
误落风尘
误落风尘 2021-01-06 07:54

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 Pho

相关标签:
2条回答
  • 2021-01-06 08:37

    With C++, you can convert from Platform::String to std::string with the following code:

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

    Reference: How to convert Platform::String to char*?

    0 讨论(0)
  • 2021-01-06 08:47

    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
    }
    
    0 讨论(0)
提交回复
热议问题