水曜日 6 18, 2008

-- ja -- 前回のブログ、scprt.c のオリジナルのソースへのリンクがありませんでしたね。 こちらを見てください。OHACのプロジェクトにあります。

あと、完結したサンプルプログラムを以下に付けておきました。

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<wchar.h>

int main(int argc, char *argv[]){

    wchar_t ws[BUFSIZ];

    setlocale(LC_ALL,"");

    if(argc<2){
        fprintf(stderr, "Need argument\n");
        exit(-1);
    }
    mbstowcs(ws, argv[1], BUFSIZ);
    printf("first:%wc\nlast :%wc\n", ws[0], ws[wcslen(ws)-1]);
}
Save it and compile. Below is example compiled as 'sample'. セーブ、コンパイルをします。以下が 'sample' としてコンパイルした時の例です。
% ./sample 国際化と地域化について
first char:国
last  char:て
このコードはサンプルなので、エラー処理やバッファーサイズに関しては考慮して いません。

火曜日 6 17, 2008

OHAC core の中に、マルチバイトロケールを扱える 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行に入る文字数を数えられる様にしているんですね。

木曜日 6 12, 2008

OHAC core のソースの中で、I18N の説明をしやすいものを、CLI からちょっとだけ探してみたんですが、いいものがありませんでした。もちろんメッセージはローカライズされたものが表示されるようになっていて、Implement されているのですが、マルチバイト文字を扱う際に、検索、編集、並び替えや、日にち及び貨幣の値等を扱う場合は、メッセージの表示をするだけの時とは別な機能が必要です。 そういうプログラムはあまりありませんでした。

日付や貨幣の値を扱う事は、あまりないかもしれませんが、データの検索並べ替え、編集はよく使いますよね。と言っても、OHAC core の様に、データ自身が ASCII で出来ていて、表示のみ各言語に翻訳されていればいいというプログラムも多いと思います。

ひとつだけマルチバイト文字を意識したプログラムがあり、それは、scprt.c という、OHAC のインターナルだけで使われているプログラムでした。このプログラムは、SC32U1 から入ったもので、clsetup や scsetup 等のコマンドの出力を、標準的な行にに収まる様、整形しています。nroff コマンドの様に画面の幅に合うように、単語を調整してくれるものです。nroff コマンドほど機能はよくありませんが、roff のコマンドに反応しないので、その面では安心して使えます。

次回に中身をかいつまんで紹介したいと思います。

水曜日 6 04, 2008

OHAC のコードが公開されたので、それについてちょっとずつ触れていきたいと思います。できれば..。

Sun Cluster 3.2 から、新しいコマンドセットが提供されるようになりましたが、これのメッセージファイルって、Java の property ファイルで提供されています。cl* のコマンドって、Java じゃないんですけど。。C++ で頑張ってるんです。property ファイルのパースを以下のディレクトリの下にあるファイルでやってるんです。

  • usr/src/cmd/clcommands/lib/libclutils/common

前に聞いた時の理由は GUI とコマンドとで、メッセージをシェアするから、との事でした。メッセージファイルは、strings.properties, errors.properies, shared.properties の3つです。/usr/cluster/lib/clcommands/properties の下に入っています。

最初は面くらいました。。。これが、SunCluster 3.2 の時に問題になってしまった所でした。SC3.2 のパッチで直りました。今後は変わるかもしれませんね。

This blog copyright 2008 by kazuhiko