将String ^转换为wstring C ++

时间:2012-12-26 23:07:53

标签: string visual-studio-2012 c++-cli wstring

我用C ++编写了一个小应用程序。 UI中有一个ListBox。我想使用ListBox的选定项目作为算法,我只能使用wstrings。

总而言之,我有两个问题: - 我可以如何转换我的

    String^ curItem = listBox2->SelectedItem->ToString();

到wstring测试?

- 代码中的^是什么意思?

非常感谢!

5 个答案:

答案 0 :(得分:10)

应该如此简单:

std::wstring result = msclr::interop::marshal_as<std::wstring>(curItem);

您还需要使用头文件来完成这项工作:

#include <msclr\marshal.h>
#include <msclr\marshal_cppstd.h>

对于好奇的人来说,这个marshal_as专业化的内容是什么样的:

#include <vcclr.h>
pin_ptr<WCHAR> content = PtrToStringChars(curItem);
std::wstring result(content, curItem->Length);

这是有效的,因为System::String在内部存储为宽字符。如果您想要std::string,则必须使用例如{1}}执行Unicode转换。 WideCharToMultiByte。方便marshal_as为您处理所有细节。

答案 1 :(得分:0)

我将此标记为重复,但这里是关于如何从System.String^转到std::string的答案。

String^ test = L"I am a .Net string of type System::String";
IntPtr ptrToNativeString = Marshal::StringToHGlobalAnsi(test);
char* nativeString = static_cast<char*>(ptrToNativeString.ToPointer());

技巧是确保使用Interop和编组,因为您必须越过托管代码到非托管代码的边界。

答案 2 :(得分:0)

我的版本是:

Platform::String^ str = L"my text";

std::wstring wstring = str->Data();

答案 3 :(得分:0)

使用Visual Studio 2015,只需执行以下操作:

String^ s = "Bonjour!";

<强> C ++ / CLI

#include <vcclr.h>
pin_ptr<const wchar_t> ptr = PtrToStringChars(s);

<强> C ++ / CX

const wchart_t* ptr = s->Data();

答案 4 :(得分:0)

据微软称:

参考 How to: Convert System::String to Standard String

<块引用>

您可以将字符串转换为 std::string 或 std::wstring,而无需在 Vcclr.h 中使用 PtrToStringChars。

// convert_system_string.cpp
// compile with: /clr
#include <string>
#include <iostream>
using namespace std;
using namespace System;

void MarshalString ( String ^ s, string& os ) {
   using namespace Runtime::InteropServices;
   const char* chars =
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

void MarshalString ( String ^ s, wstring& os ) {
   using namespace Runtime::InteropServices;
   const wchar_t* chars =
      (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

int main() {
   string a = "test";
   wstring b = L"test2";
   String ^ c = gcnew String("abcd");

   cout << a << endl;
   MarshalString(c, a);
   c = "efgh";
   MarshalString(c, b);
   cout << a << endl;
   wcout << b << endl;
}

输出:

test
abcd
efgh