● ToolBox API徒然草(2006/12/18)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 Carbonモダンアプリケーションへの道(その6) 〜


前回は、Pascalストリングスの代わりとして登場したCFStringを簡単に紹介しました。今回は、さらに詳しくその特徴や活用方法などについて解説したいと思います。

前回、CreateNibReference() APIにCFStringRefで参照されるNibファイル名を渡す時、引数が定数(固定値)であれば、CFSTR()の内部にCストリングスを記述すればOKだと解説しました。以下のような感じです。

CreateNibReference( CFSTR( "Dialog" ),&nibRef );

ただし、この記述方法が利用できるのは、CFSTR()内の文字列が半角英数字の場合に限ります。例えば、「ウィンドウ.nib」というNibファイルを作成しておき...

CreateNibReference( CFSTR( "ウィンドウ" ),&nibRef );

と記載したとしても、ソースコードをコンパイルする時点でエラーが発生します。このエラーを回避するには、日本語のCストリングについてはソースコード内に記述可能ですので、前回紹介したcToCFString()ルーチンでCFStringRefを得てからCreateNibReference()に渡します。作成したCFStringRefは、disposeCFString()により解放することを忘れないでください。

cToCFString( "ウィンドウ",CFStringRef &cfstr );
CreateNibReference( cfstr,&nibRef );
disposeCFString( cfstr );

ところが、この方法で万事うまく行くかと言うと現実はそんない甘くありません(笑)。例えば「一覧表.nib」というNibファイルを作成し、同処理をするためのソースコードを以下のように記述しておきます。

cToCFString( "一覧表",CFStringRef &cfstr );

すると、この行でコンパイルエラーが発生することが分かります。原因は「表」という文字のShift-JISコードにあります。「表」のコードは0x955Cですが、その2バイト目の0x5Cがアルファベットのバックスラッシュ(日本語キーボードだと\マーク)に相当するため、コンパイラが正しくソースコードを解釈出来ないわけです。

こうした制限を把握した上で、日本語文字列をソースコード内に記述することについては自己責任であり大きな問題はありません。しかし通常は、外部ファイル(テキストファイルやリソースファイル)に文字列を保存しておき、そこから逐次読み出してAPIや自作ルーチンで使うのが一番安全で確実な方法です。よって前回でも書きましたが、筆者はGetIndString()というSTR#リソースからインデックス番号参照で特定のPascalストリングスを抽出してくるAPIを使い、様々な文字処理に活用していました。ところが、このAPIがDEPRECATED指定になってしまったので、現在は以下のような代用ルーチンを作成して活用しています。



このgetIndCString()ルーチンでは、引数としてリソースIDと文字列のインデックス番号を渡すことで、指定されたSTR#リソースからCストリングスを抽出してきます(オリジナルはPascalストリングスだった)。この場合に注意する点は、リソースデータはすべてビックエンディアンで保存されているということです。そのため、x86などのリトルエンデイァン環境では、ワードデータ(shot)やダブルワードデータ(long,float)などはスワップ処理をする必要があります。

こうして得られたCストリングスを色々な処理に活用するわけですが、Cストリングスの変数をいちいち配列として記述するのが面倒な場合には、PascalストリングのStr255を真似して、typedefにより以下のような定義をしておくと便利です。そして、必要な文字列の長さにより、これらをうまく使い分けるようにします。

typedef char CStr1023[1024];
typedef char CStr511[512];
typedef char CStr255[256];
typedef char CStr63[64];
typedef char CStr31[32];
typedef char CStr15[16];

また、STR#リソースから直接CFStringRefが欲しい場合には、以下のようなルーチンを用意します。



上記ルーチンを利用して、ID番号で指定した文字表示用コントロール(カラム)にSTR#リソースから抽出した文字列を表示するのには、以下のようなルーチンを使います。



こうしてソースコード内ではなく外部ファイルから文字列データを持ってくる方法は、自作アプリケーションを多国語対応にするには最適な方法です。ただし、多国語対応の場合には、Shift-JISコードで表記できない文字列を用意しなければいけない場合が多々あります。そこで登場するのがユニコードです。次回はユニコードを操作するAPIについて、その特徴や活用方法などを解説したいと思います。


copyright 2006 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp