旧バージョンのC++Builderのソースコードを最新バージョンに移行する際に必要となるUnicodeサポートに関する情報が、Delphiと比較すると少ないという声が寄せられています。
Delphiはバージョン2009以降、Unicodeサポートが加わり、デフォルトの文字列型がUnicodeStringとなることで、コンポーネントフレームワーク内での文字列処理がUnicodeベースで行われるようになりました。原則的には、string型のマッピングが従来のAnsiStringからUnicodeStringに置き換わることで、一切のコード修正を行うことなくUnicode対応ができるのですが、実際には部分文字列の切り出し、文字数カウント、外部入出力などにおいて文字コードを意識する必要があり、これらの部分については修正が必要となります。
こうした修正はDelphiだけでなくC++Builderにも適用できるRTLのUnicode対応のTIPSとして多くの情報がありますが、C++固有のものとしては決して多くの情報があるわけではありません。
C++Builderに関して言えば、そこで使用される文字列型や文字列処理関数は、Delphiと同様のRTLのものだけでなく、C言語の文字列型、C++の文字列型などさまざまなです。また、アプリケーションの分野も、いわゆる基幹系システムのたぐいだけでなく、機械の制御やネットワーク通信など、ある程度低レベルの処理を含んだものが多数あります。これは、C++(どちらかというとC)言語の特性に起因するところも多いでしょう。
C++BuilderでUnicodeサポートを行う場合、こうしたアプリケーションの特性を理解することが重要です。
ビデオ「C++BuilderプロジェクトのUnicodeへの移行」
C++BuilderのUnicodeサポートについては、アル・マナリーノ氏の「C++BuilderプロジェクトのUnicodeへの移行」というYouTubeビデオで詳しく説明されています。
詳細はこちらのビデオを見ていただくとして、C++BuilderアプリケーションにおけるUnicodeサポートの骨子を以下にまとめておきましょう。
C++Builderアプリケーションは、Delphiと異なり文字列の扱い方が複数存在するため、VCL/RTLでのUnicodeサポートと分離して考えることができます。
つまり、
- アプリケーション全体を完全にUnicode化する「完全な移行」
- コードはANSIのままでVCLとのインターフェイスのみをUnicode化する「最小の移行」
の2種類を選択できます。
完全な移行(Unicodeフル対応)
前者を選択した場合には、以下のようなステップで完全なUnicode対応を実施します。
- 10.x向けのサードパーティライブラリを確認
- 10.xに変換する前に…
- AnsiStringをStringに置換
- 文字列リテラルに「_T」マクロを使用
- Cライブラリルーチンをtchar.hの同等のものに置換
- C++typedefを追加
- 10.xにプロジェクトを変換
- 「_TCHARのマップ先」を「char」に指定
- AnsiString、RawByteString、UTF8Stringを導入
- ANSI vs Unicode問題に対応
- 可変引数のマクロを確認
- インデックス化されたり分割している文字列がないか?
アプリケーションで国際化対応が必要であったり、システム全体としてUnicodeサポートが必須となっている場合には、この「完全な移行」アプローチを選択する必要があります。ANSIへの変換がアプリケーションコード内に残存していることで、一部の文字列データが失われる恐れがあることを理解していなければなりません。
最小の移行(コードはANSIのまま)
一方、後者を選択した場合には、以下のステップを行うだけで、最新バージョンへと移行することができます。
- 10.x向けのサードパーティライブラリを確認
- 10.xにプロジェクトを変換
- 「_TCHARのマップ先」を「char」に指定
- StringをAnsiStringに置換
- UnicodeのVCLコードとANSIのアプリケーションコード間のやり取りを制御
- 可変引数のマクロを確認
C++Builderアプリケーションでは、しばしばユーザーインターフェイスの構築のみにVCL/RTLを用い、それ以外の箇所ではヌル終端文字列や他のC++ライブラリの文字列型を使用しているケースが見受けられます。このようなアプリケーションでは、Unicodeサポートが必須でない場合、C++コードの文字列処理はそのままにし、VCLとのインターフェイスのみ、Unicode/ANSI変換を行うという方法を採用できます。
ただし、この場合には、Unicodeサポートによってもたらされる国際化の恩恵が受けられないか、限定的になることを理解しておく必要があります。
なお、このビデオは、旧バージョンのC++Builderプロジェクトを開く方法として、旧プロジェクトをそのまま最新バージョンで開こうとするのではなく、新規プロジェクトを作成してソースファイルを追加する方法を推奨しています。
詳細はビデオを見ていただければ分かりますが、プロジェクトオプション設定をデフォルトから開始することで、予期しないトラブルを抑止するなどの効果があります。