Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将平台::字符串转换为标准::字符串 我在Windows Chone 8项目COCOS2DX游戏中,在C++WINRT组件中的C++组件中调用了包含一些印第安语言字符的字符串^ < /COD>。_C#_C++_Windows Phone 8_Cocos2d X_Winrt Component - Fatal编程技术网

C# 将平台::字符串转换为标准::字符串 我在Windows Chone 8项目COCOS2DX游戏中,在C++WINRT组件中的C++组件中调用了包含一些印第安语言字符的字符串^ < /COD>。

C# 将平台::字符串转换为标准::字符串 我在Windows Chone 8项目COCOS2DX游戏中,在C++WINRT组件中的C++组件中调用了包含一些印第安语言字符的字符串^ < /COD>。,c#,c++,windows-phone-8,cocos2d-x,winrt-component,C#,C++,Windows Phone 8,Cocos2d X,Winrt Component,每当我将其转换为std::string时,印地语和其他字符就会变成垃圾字符。我不知道为什么会这样 这里是一个示例代码,我刚刚定义了平台::String ^ < /Cuff>,但是请考虑它从C++的组件传递到C++WRRT/Cuths>代码> String^ str = L"विकास, વિકાસ, ਵਿਕਾਸ, Vikas"; std::wstring wsstr(str->Data()); std::string res(wsstr.begin(), wsstr.end()); 编辑

每当我将其转换为
std::string
时,印地语和其他字符就会变成垃圾字符。我不知道为什么会这样

这里是一个示例代码,我刚刚定义了平台::String ^ < /Cuff>,但是请考虑它从C++的组件

传递到C++WRRT/Cuths>代码>
String^ str = L"विकास, વિકાસ, ਵਿਕਾਸ, Vikas";
std::wstring wsstr(str->Data());
std::string res(wsstr.begin(), wsstr.end());
编辑:有关更好的便携式解决方案,请参阅

问题是
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
}
std::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::使_唯一(缓冲区大小);
if(0==wideChartMultiByte(CP_UTF8,0,wideData,-1,UTF8.get(),bufferSize,NULL,NULL))
抛出std::exception(“无法将字符串转换为UTF8”);
返回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);
自动宽度=标准::使_唯一(缓冲区大小);
if(0==MultiByteToWideChar(CP_UTF8,0,utf8Data,-1,wide.get(),bufferSize))
抛出std::exception(“无法将字符串转换为Unicode”);
返回std::wstring(wide.get());
}
无效测试()
{
平台::字符串^str=L“विकास, વિકાસ, ਵਿਕਾਸ, 维卡斯”;
std::wstring wsstr(str->Data());
auto utf8Str=生成字符串(wsstr);//UTF8编码的文本
wsstr=make_wstring(utf8Str);//与原始文本相同
}

<代码> > p> > C++,您可以从<代码>平台::字符串转换为<代码> STD::String >下面的代码:

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

参考资料:

能否将其作为
wstring
保存?@PeterTorr MSFT
wstring
内容与
String^
相同,但问题是将其转换为
std::String
时会丢失非英语字符的编码,非常感谢:(代码)> STD::MaMaIOLION/<代码>只适用于WP 8.1的通用C++项目,对于像WP8 0这样的老平台,我必须使用CHAR数组。我发现了一个例子:std::codevect?@gMorphus,我没有意识到这一点,所以谢谢你的提示(仅供参考,其他人尝试使用std::codevct
)。实际上,基于另一个问题,这是我找到的最短的前进方式。这对OP的例子有效吗?最后两个语句与问题中的基本相同,将把宽字符截断为8位,并丢失信息。请使用Begin(),而不是Data()@uli如果您是对的,此解决方案不适用于平台字符串中的unicode数据。