কেউ দয়া করে এমন একটি সাধারণ কোড পোস্ট করতে পারেন যা রূপান্তর করতে পারে,
System::String^
প্রতি,
সি ++ std::string
যেমন, আমি কেবল এর মান নির্ধারণ করতে চাই,
String^ originalString;
প্রতি,
std::string newString;
উত্তর:
আপনার নিজের রোল করবেন না, মাইক্রোসফ্ট দ্বারা সরবরাহিত এই হ্যান্ডি (এবং এক্সটেনসিবল) র্যাপারগুলি ব্যবহার করুন।
উদাহরণ স্বরূপ:
#include <msclr\marshal_cppstd.h>
System::String^ managed = "test";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);
আপনি নিম্নলিখিত হিসাবে সহজেই এটি করতে পারেন
#include <msclr/marshal_cppstd.h>
System::String^ xyz="Hi boys";
std::string converted_xyz=msclr::interop::marshal_as< std::string >( xyz);
এটি আমার পক্ষে কাজ করেছে:
#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;
সি ++ / ক্লাইপ প্রকল্পের জন্য আমি বেশ কয়েক বছর আগে লিখেছি এমন কিছু রূপান্তর রুটিনাম রয়েছে, তাদের এখনও কাজ করা উচিত ।
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;
}
আমি উইন্ডোজ ফর্মের তালিকা তালিকার টোস্ট্রিংয়ের মানটিকে একটি স্ট্রিং মান রূপান্তর করার চেষ্টা করে ঘন্টা ব্যয় করেছি যাতে আমি এটিকে ফ্রিস্ট্রিমে টেক্সট ফাইলে আউটপুটে ব্যবহার করতে পারি। আমার ভিজ্যুয়াল স্টুডিও মার্শাল শিরোলেখ ফাইলগুলির সাথে আসে নি যা আমি পেয়েছি এমন বেশ কয়েকটি উত্তর ব্যবহার করতে বলেছিল। এত পরীক্ষার এবং ত্রুটির পরে অবশেষে আমি সমস্যার সমাধান পেয়েছি যা কেবলমাত্র সিস্টেম :: রানটাইম :: ইন্টারপ সার্ভিসগুলি ব্যবহার করে:
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;
এবং এখানে উদাহরণ সহ এমএসডিএন পৃষ্ঠা রয়েছে: http://msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx
আমি জানি এটি একটি খুব সহজ সমাধান তবে এটি আমাকে সমস্যার সমাধানের সময় এবং বেশিরভাগ ফোরাম পরিদর্শন করেছে যা শেষ পর্যন্ত কাজ করেছে something
আমি স্ট্রিং from থেকে স্টাডি :: স্ট্রিংয়ের একটি সহজ উপায় পেয়েছি স্প্রিন্টফ () ব্যবহার করা।
char cStr[50] = { 0 };
String^ clrString = "Hello";
if (clrString->Length < sizeof(cStr))
sprintf(cStr, "%s", clrString);
std::string stlString(cStr);
মার্শাল ফাংশন কল করার দরকার নেই!
আপডেট আপডেট এরিকের জন্য, আমি বাফার ওভারফ্লো প্রতিরোধে ইনপুট স্ট্রিংয়ের আকারটি পরীক্ষা করতে স্যাম্পল কোডটি পরিবর্তন করেছি।
সি # তার স্ট্রিংয়ের জন্য ইউটিএফ 16 ফর্ম্যাট ব্যবহার করে।
সুতরাং, কেবল ধরণের রূপান্তরিত করার পাশাপাশি, আপনার স্ট্রিংয়ের আসল বিন্যাস সম্পর্কেও সচেতন হওয়া উচিত।
জন্য কম্পাইল মাল্টি বাইট ক্যারেক্টার সেট ভিসুয়াল স্টুডিও এবং উইন এপিআই UTF8 হওয়া অনুমান (আসলে যা এনকোডিং উইন্ডোজ উইন্ডোজ 28591 )।
যখন ইউনিকোড চরিত্র সেট করার জন্য ভিজ্যুয়াল স্টুডিও এবং উইন এপিআই ইউটিএফ 16 ধরে নেয়।
সুতরাং, আপনাকে অবশ্যই স্ট্রিংটি ইউটিএফ 16 থেকে ইউটিএফ 8 ফর্ম্যাটে রূপান্তর করতে হবে, এবং কেবল এসডিডি স্ট্রিংতে রূপান্তর করতে হবে না।
কিছু নন-ল্যাটিন ভাষার মতো মাল্টি-ক্যারেক্টার ফর্ম্যাটগুলির সাথে কাজ করার সময় এটি প্রয়োজনীয় হয়ে উঠবে।
ধারণাটি স্থির হয় যে std::wstring
সর্বদা UTF16 প্রতিনিধিত্ব করে ।
এবং std::string
সর্বদা ইউটিএফ 8 প্রতিনিধিত্ব করে ।
এটি সংকলক দ্বারা প্রয়োগ করা হয়নি, এটির জন্য আরও ভাল নীতি রয়েছে।
#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;
}
বা এটি আরও কমপ্যাক্ট বাক্য গঠনতে রাখুন:
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;
}
// আমি কোডটি নীচে লিখতে ভিএস ২০১২ ব্যবহার করেছি - রূপান্তর_ সিস্টেম_ স্ট্রিংটিকে স্ট্যান্ডার্ড_সটিংয়ে রূপান্তর করি
#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;
}