この文書の現在のバージョンと選択したバージョンの差分を表示します。
clr:文字列 [2009/02/03 07:44] admin 作成 |
clr:文字列 [2013/12/23 09:08] |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ====== 文字列 ====== | ||
- | |||
- | C++/CLIの文字列操作は、System::Stringを使います。ソースコード中のリテラル文字列は、必要に応じてString^に格上げされます。内部的にはwchar_t(UTF-16)で値を保持しています。 | ||
- | |||
- | ===== char*やwchar_t*からString^への変換 ===== | ||
- | |||
- | <code cpp> | ||
- | const char* p = "AAA"; | ||
- | String^ s = gcnew String(p); | ||
- | </code> | ||
- | でできます。 | ||
- | |||
- | ===== String^からwchar_t*への変換 ===== | ||
- | |||
- | <code cpp> | ||
- | #include <vcclr.h> | ||
- | |||
- | String^ s = L"AAA"; | ||
- | pin_ptr<const wchar_t> pIn = PtrToStringChars(s); | ||
- | </code> | ||
- | |||
- | ==== String^からchar*への変換 ==== | ||
- | String^はユニコードなので変換の際には注意が必要。 | ||
- | |||
- | === StringToHGlobalAnsiを使う === | ||
- | <code cpp> | ||
- | 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; | ||
- | } | ||
- | </code> | ||
- | |||
- | === wcstombs_sを使う。locale依存 === | ||
- | <code cpp> | ||
- | std::string getStdString(String^ s) | ||
- | { | ||
- | std::string ret; | ||
- | if ( s == nullptr ) | ||
- | return ret; | ||
- | |||
- | pin_ptr<const wchar_t> 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; | ||
- | } | ||
- | </code> | ||
- | |||
- | Stringの基本事項として、一度設定したら内部の文字列は変化しない(内部の文字列を変更するメソッドはない)があります。これによってあるString^ハンドルによる操作で、たのString^ハンドルの文字列が変化することを心配する必要がなくなります。 | ||
- | |||
- | また、Stringに対してで暗黙のCLRサポートがあります。 | ||
- | |||
- | - ==で比較すると、ハンドルの比較ではなくて文字列の比較が行われる。!=も同様 | ||
- | - +で色々な型を足すことができる。 | ||
- | |||
- | これら関してはC++との互換性で影響が出ることがあります。 | ||
- | |||
- | 以下のC++コードはC++/CLIだとコンパイルエラーになります。 | ||
- | <code cpp> | ||
- | #include "stdio.h" | ||
- | int main(int argc, char* argv[]) | ||
- | { | ||
- | const char* p = "ABC" + 1; | ||
- | printf(p); | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== 空文字の扱い ===== | ||
- | |||
- | |||
- | 空文字を扱うための仕組みもあるので""やL""よりもこちらを使うほうがいいかもしれません。 | ||
- | <code cpp> | ||
- | if ( s == nullptr || s->Length == 0 ) | ||
- | return; | ||
- | </code> | ||
- | の代わりに | ||
- | <code cpp> | ||
- | if ( String::IsNullOrEmpty(s) ) | ||
- | return; | ||
- | </code> | ||
- | |||
- | |||
- | 同様に | ||
- | <code cpp> | ||
- | return L""; | ||
- | </code> | ||
- | の代わりに | ||
- | <code cpp> | ||
- | return String::Empty; | ||
- | </code> |