Ai đó có thể vui lòng đăng một mã đơn giản có thể chuyển đổi,
System::String^
Đến,
C ++ std::string
Tức là, tôi chỉ muốn gán giá trị của,
String^ originalString;
Đến,
std::string newString;
Câu trả lời:
Đừng cuộn của riêng bạn, hãy sử dụng các trình bao bọc tiện dụng (và có thể mở rộng) này do Microsoft cung cấp.
Ví dụ:
#include <msclr\marshal_cppstd.h>
System::String^ managed = "test";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);
Bạn có thể dễ dàng làm điều này như sau
#include <msclr/marshal_cppstd.h>
System::String^ xyz="Hi boys";
std::string converted_xyz=msclr::interop::marshal_as< std::string >( xyz);
Điều này đã làm việc cho tôi:
#include <stdlib.h>
#include <string.h>
#include <msclr\marshal_cppstd.h>
//..
using namespace msclr::interop;
//..
System::String^ clrString = (TextoDeBoton);
std::string stdString = marshal_as<std::string>(clrString); //String^ to std
//System::String^ myString = marshal_as<System::String^>(MyBasicStirng); //std to String^
prueba.CopyInfo(stdString); //MyMethod
//..
//Where: String^ = TextoDeBoton;
//and stdString is a "normal" string;
Dưới đây là một số quy trình chuyển đổi tôi đã viết nhiều năm trước cho một dự án c ++ / cli, chúng vẫn sẽ hoạt động.
void StringToStlWString ( System::String const^ s, std::wstring& os)
{
String^ string = const_cast<String^>(s);
const wchar_t* chars = reinterpret_cast<const wchar_t*>((Marshal::StringToHGlobalUni(string)).ToPointer());
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
System::String^ StlWStringToString (std::wstring const& os) {
String^ str = gcnew String(os.c_str());
//String^ str = gcnew String("");
return str;
}
System::String^ WPtrToString(wchar_t const* pData, int length) {
if (length == 0) {
//use null termination
length = wcslen(pData);
if (length == 0) {
System::String^ ret = "";
return ret;
}
}
System::IntPtr bfr = System::IntPtr(const_cast<wchar_t*>(pData));
System::String^ ret = System::Runtime::InteropServices::Marshal::PtrToStringUni(bfr, length);
return ret;
}
void Utf8ToStlWString(char const* pUtfString, std::wstring& stlString) {
//wchar_t* pString;
MAKE_WIDEPTR_FROMUTF8(pString, pUtfString);
stlString = pString;
}
void Utf8ToStlWStringN(char const* pUtfString, std::wstring& stlString, ULONG length) {
//wchar_t* pString;
MAKE_WIDEPTR_FROMUTF8N(pString, pUtfString, length);
stlString = pString;
}
Tôi đã dành hàng giờ để cố gắng chuyển đổi giá trị ToString của hộp danh sách windows thành một chuỗi tiêu chuẩn để tôi có thể sử dụng nó với fstream để xuất ra tệp txt. Visual Studio của tôi không đi kèm với các tệp tiêu đề thống nhất mà một số câu trả lời tôi tìm thấy được cho là sử dụng. Sau rất nhiều lần thử và sai, cuối cùng tôi đã tìm ra giải pháp cho vấn đề chỉ sử dụng System :: Runtime :: InteropServices:
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));
}
//this is the code to use the function:
scheduleBox->SetSelected(0,true);
string a = "test";
String ^ c = gcnew String(scheduleBox->SelectedItem->ToString());
MarshalString(c, a);
filestream << a;
Và đây là trang MSDN với ví dụ: http://msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx
Tôi biết đó là một giải pháp khá đơn giản nhưng điều này đã khiến tôi mất GIỜ khắc phục sự cố và truy cập một số diễn đàn để cuối cùng tìm thấy thứ gì đó hoạt động.
Tôi đã tìm thấy một cách dễ dàng để lấy std :: string từ String ^ là sử dụng sprintf ().
char cStr[50] = { 0 };
String^ clrString = "Hello";
if (clrString->Length < sizeof(cStr))
sprintf(cStr, "%s", clrString);
std::string stlString(cStr);
Không cần gọi các hàm Nguyên soái!
CẬP NHẬT Cảm ơn Eric, tôi đã sửa đổi mã mẫu để kiểm tra kích thước của chuỗi đầu vào để ngăn chặn tràn bộ đệm.
C # sử dụng định dạng UTF16 cho các chuỗi của nó.
Vì vậy, bên cạnh việc chỉ chuyển đổi các kiểu, bạn cũng nên biết về định dạng thực tế của chuỗi.
Khi biên dịch cho bộ ký tự nhiều byte, Visual Studio và Win API giả định UTF8 (Trên thực tế mã hóa cửa sổ là Windows-28591 ).
Khi biên dịch cho bộ ký tự Unicode, Visual studio và Win API giả sử UTF16.
Vì vậy, bạn cũng phải chuyển đổi chuỗi từ định dạng UTF16 sang UTF8 và không chỉ chuyển đổi sang std :: string.
Điều này sẽ trở nên cần thiết khi làm việc với các định dạng nhiều ký tự như một số ngôn ngữ không phải là ngôn ngữ latin.
Ý tưởng là quyết định rằng std::wstring
luôn đại diện cho UTF16 .
Và std::string
luôn đại diện cho UTF8 .
Điều này không được thực thi bởi trình biên dịch, đó là một chính sách tốt hơn.
#include "stdafx.h"
#include <string>
#include <codecvt>
#include <msclr\marshal_cppstd.h>
using namespace System;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
//Actual format is UTF16, so represent as wstring
std::wstring utf16NativeString = context.marshal_as<std::wstring>(managedString);
//C++11 format converter
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
//convert to UTF8 and std::string
std::string utf8NativeString = convert.to_bytes(utf16NativeString);
return 0;
}
Hoặc có nó trong một cú pháp nhỏ gọn hơn:
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string utf8NativeString = convert.to_bytes(context.marshal_as<std::wstring>(managedString));
return 0;
}
// Tôi đã sử dụng VS2012 để viết mã bên dưới-- convert_system_string thành Standard_Sting
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace System;
using namespace Runtime::InteropServices;
void MarshalString ( String^ s, std::string& outputstring )
{
const char* kPtoC = (const char*) (Marshal::StringToHGlobalAnsi(s)).ToPointer();
outputstring = kPtoC;
Marshal::FreeHGlobal(IntPtr((void*)kPtoC));
}
int _tmain(int argc, _TCHAR* argv[])
{
std::string strNativeString;
String ^ strManagedString = "Temp";
MarshalString(strManagedString, strNativeString);
std::cout << strNativeString << std::endl;
return 0;
}