问题描述
我得到 String ^
其中包含在C#组件回调中的一些印度语字符在我的C ++ WinRT组件在Windows Phone 8项目的Cocos2dx游戏。 p>
每当我将它转换为 std :: string
时,印地语和其他字符变成垃圾字符。我不能找到为什么会发生这种情况。
这里是一个示例代码,我已经定义 Platform :: String ^
在这里,但考虑它传递给 C ++ WinRT组件
从C#组件
String ^ str = Lविकास,பાસ,ਵਿਕਾਸ,Vikas;
std :: wstring wsstr(str-> Data());
std :: string res(wsstr.begin(),wsstr.end());
Edit:see 是一个更好的便携式解决方案。
问题是 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( 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 not 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); //与原始文字相同
}
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());
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
}
这篇关于将Platform :: String转换为std :: string的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!