C++/CLIでSystem.String<->std:string

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

C++/CLIでSystem.String<->std:string

投稿記事 by naohiro19 » 13年前

System::String⇔std::string の変換は文字コードを変換する必要があります。

CODE:

#using 

using namespace System;
using namespace System::Text;
using namespace System::Runtime::InteropServices;

#include 
#include 
#include 
#include 

#pragma unmanaged

const char* greet(const char* name)
{
	static char result[128];
	strcpy_s(result, 128, name);
	strcat_s(result, 128, "さん、こんにちは");
	return result;
}


#pragma managed

String^ ToCLI(const std::string& input, System::Text::Encoding^ encoding)
{
	return gcnew String(input.data(), 0, input.size(), encoding);
}

// System::Stringからstd::stringへの変換
 std::string FromCLI(
   String^ input,
   System::Text::Encoding^ encoding) {
   std::string result;
   if ( input != nullptr &&  input->Length > 0 ) {
     array^ barray =
       System::Text::Encoding::Convert(
           Encoding::Unicode, // 変換元エンコーディング
           encoding,          // 変換先エンコーディング
           Encoding::Unicode->GetBytes(input));
     pin_ptr pin = &barray[0];
     result.assign(reinterpret_cast(pin), barray->Length);
   }
   return result;
 } 
public ref class GreetLib
{
public:
	static String^ Greet(String^ name)
	{
		System::Text::Encoding^ sjis = Text::Encoding::GetEncoding("shift_jis");
		std::string input = FromCLI(name, sjis);
		std::string res = greet(input.c_str() );
		return ToCLI(res, sjis);
	}

};

int main(array^ args)
{
	String^ name = gcnew String("C言語交流フォーラム ~ mixC++ ~");
	Console::WriteLine("{0}", GreetLib::Greet(name));
	Console::ReadKey();
	return 0;
}
出力結果:

CODE:

C言語交流フォーラム ~ mixC++ ~さん、こんにちは
最後に編集したユーザー naohiro19 on 2012年6月12日(火) 09:04 [ 編集 2 回目 ]

コメントはまだありません。