Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++

C++Builder開発者のためのUnicodeサポート情報

旧バージョンの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対応を実施します。

  1. 10.x向けのサードパーティライブラリを確認
  2. 10.xに変換する前に…
    • AnsiStringをStringに置換
    • 文字列リテラルに「_T」マクロを使用
    • Cライブラリルーチンをtchar.hの同等のものに置換
  3. C++typedefを追加
  4. 10.xにプロジェクトを変換
  5. 「_TCHARのマップ先」を「char」に指定
  6. AnsiString、RawByteString、UTF8Stringを導入
  7. ANSI vs Unicode問題に対応
  8. 可変引数のマクロを確認
  9. インデックス化されたり分割している文字列がないか?

アプリケーションで国際化対応が必要であったり、システム全体としてUnicodeサポートが必須となっている場合には、この「完全な移行」アプローチを選択する必要があります。ANSIへの変換がアプリケーションコード内に残存していることで、一部の文字列データが失われる恐れがあることを理解していなければなりません。

最小の移行(コードはANSIのまま)

一方、後者を選択した場合には、以下のステップを行うだけで、最新バージョンへと移行することができます。

  1. 10.x向けのサードパーティライブラリを確認
  2. 10.xにプロジェクトを変換
  3. 「_TCHARのマップ先」を「char」に指定
  4. StringをAnsiStringに置換
  5. UnicodeのVCLコードとANSIのアプリケーションコード間のやり取りを制御
  6. 可変引数のマクロを確認

C++Builderアプリケーションでは、しばしばユーザーインターフェイスの構築のみにVCL/RTLを用い、それ以外の箇所ではヌル終端文字列や他のC++ライブラリの文字列型を使用しているケースが見受けられます。このようなアプリケーションでは、Unicodeサポートが必須でない場合、C++コードの文字列処理はそのままにし、VCLとのインターフェイスのみ、Unicode/ANSI変換を行うという方法を採用できます。

ただし、この場合には、Unicodeサポートによってもたらされる国際化の恩恵が受けられないか、限定的になることを理解しておく必要があります。

なお、このビデオは、旧バージョンのC++Builderプロジェクトを開く方法として、旧プロジェクトをそのまま最新バージョンで開こうとするのではなく、新規プロジェクトを作成してソースファイルを追加する方法を推奨しています。

詳細はビデオを見ていただければ分かりますが、プロジェクトオプション設定をデフォルトから開始することで、予期しないトラブルを抑止するなどの効果があります。

See What's New in 12.2 Athens See What's New in 12.2 Athens Dev Days of Summer 2-24

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

IN THE ARTICLES