C++ での Delphi AnsiString コード ページ指定の扱い方
C++Builder での Delphi 機能の取り扱い:インデックス への移動
AnsiString
型の C++ 実装には、Delphi で利用できるものに似た、CodePage サポート機能が提供されています。 ただし、Delphi 版は言語の拡張によって実装されているのに対し、C++ 版は次にように、型なしパラメータ codepage
を取るテンプレートを介して実装されています:
template AnsiStringT<unsigned short codePage>
このため、これまで AnsiString
型と呼ばれていた型は、ここでは、単に新しい AnsiStringT
テンプレートの型定義(typedef)となっています:
typedef AnsiStringT<65001> UTF8String; typedef AnsiStringT<65535> RawByteString;
必要なコード ページで AnsiStringT
を特化した型を、他にも宣言することができます。
AnsiStringT
インスタンスに代入する場合はすべて、データはその型のコード ページにエンコードされます。 たとえば、以下のコードでは、UTF8String
型の変数に代入された Unicode データは自動的に UTF8 でエンコードされます。
const wchar_t* data = L"СЛАДКОЕ"; UTF8String utfs(data);
utfs
変数は UnicodeString
を想定している関数に渡すことができ、以下のように、元のデータは損失なしに復元されます。
Button1->Caption = utfs; // Set button caption to "СЛАДКОЕ"
なお、codepage
のサポートは AnsiStringT
によって裏で処理されますが、次のメソッドを呼び出すことで、インスタンスのコード ページを明示的に設定することもできます:
AnsiStringT<CP>::SetCodePage(unsigned short codePage, bool convert=true)
ただし、インスタンスを使用する方は、デフォルトのコード ページでエンコードされたデータが型に入っていると誤解するおそれがあるため、このメソッドを使用する際には注意が必要です。
メモ: DefaultSystemCodePage は 0 です。