{{indexmenu_n>1}}
====== 文字列 ======
C++/CLIの文字列操作は、System::Stringを使います。ソースコード中のリテラル文字列は、必要に応じてString^に格上げされます。内部的にはwchar_t(UTF-16)で値を保持しています。
===== char*やwchar_t*からString^への変換 =====
const char* p = "AAA";
String^ s = gcnew String(p);
でできます。
===== String^からwchar_t*への変換 =====
#include
String^ s = L"AAA";
pin_ptr pIn = PtrToStringChars(s);
==== String^からchar*への変換 ====
String^はユニコードなので変換の際には注意が必要。
=== StringToHGlobalAnsiを使う ===
std::string getStdString(String^ s)
{
std::string ret;
System::IntPtr pp = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s);
ret = (const char*)pp.ToPointer() ;
System::Runtime::InteropServices::Marshal::FreeHGlobal(pp);
return ret;
}
=== wcstombs_sを使う。locale依存 ===
std::string getStdString(String^ s)
{
std::string ret;
if ( s == nullptr )
return ret;
pin_ptr p = PtrToStringChars(s);
size_t len = (s->Length+1) * sizeof(wchar_t);
char* pT = (char*)malloc(len);
size_t retutrnvalue;
if ( 0 != wcstombs_s( &retutrnvalue,
pT,
len,
p,
len ) )
{
free(pT);
return ret;
}
ret = pT;
free(pT);
return ret;
}
Stringの基本事項として、一度設定したら内部の文字列は変化しない(内部の文字列を変更するメソッドはない)があります。これによってあるString^ハンドルによる操作で、たのString^ハンドルの文字列が変化することを心配する必要がなくなります。
また、Stringに対してで暗黙のCLRサポートがあります。
- ==で比較すると、ハンドルの比較ではなくて文字列の比較が行われる。!=も同様
- +で色々な型を足すことができる。
これら関してはC++との互換性で影響が出ることがあります。
以下のC++コードはC++/CLIだとコンパイルエラーになります。
#include "stdio.h"
int main(int argc, char* argv[])
{
const char* p = "ABC" + 1;
printf(p);
return 0;
}
===== 空文字の扱い =====
空文字を扱うための仕組みもあるので""やL""よりもこちらを使うほうがいいかもしれません。
if ( s == nullptr || s->Length == 0 )
return;
の代わりに
if ( String::IsNullOrEmpty(s) )
return;
同様に
return L"";
の代わりに
return String::Empty;