i18n コマンドの例
コマンドでは、時々翻訳されたメッセージを表示するだけでは なくて、マルチバイトロケールの文字列を検索したり編集したりする必要が ある時がありますよね。これって、マルチバイトから出来た文字を、1つずつ 扱える必要があるという事ですよね。
scsetup と clsetup という OHAC core のコマンドは、CLI というよりも CUI でして、表示されるメッセージをフォーマットして、ターミナルの幅に合うようにしています。scprt と言う内部コマンドがこのフォーマットで使われているんです。
これには、ワイド文字というものを使用します。 ひとつのワイド文字は、数バイト分の長さのある文字1つを保持します。 そして、ワイド文字関数を使うと、これらの文字列操作をマルチバイトロケールが可能になります。
scprt.c の中で、ワイド文字の変数 が宣言されています。 'char *' と同様に、'wchar_t *' は wchar_t から出来た文字列を指すことが 出来ます。プログラムは この行で、マルチバイト文字をワイド文字に変換していますね。 これで、最初に定義したワイド文字に、一文字づつ配列としてアクセス 出来る様になりました。例えば、wthis_line[0] は、実際は数バイト分の長さのある、最初の1文字を表す様になります。printf() だと、この文字は '%wc' のフォーマットで、端末上に表示できます。ひとつの文字に対するバイトの長さが、それぞれのマルチバイトロケールで異なっているので、固定したバイト長を 仮定することはできないんですよね。このために setlocale() 関数を、コードの最初で 使って、ランタイムのロケールを適切に伝えてあげる必要があるんですよね。 ここ でやっています。 この scprt.c 中の setlocale() は、適切なロケールの環境変数を取り出し、 これを使って、そのロケールに基づいて wchar_t を操作出来るようにしています。
この後もコードは続きますが、こうして1行に入る文字数を数えられる様にしているんですね。
