JFP では、日本語特有の処理を行うために libjapanese.a [「はじめに」でも述べましたが、ここで紹介するインタフェースは、ja (または japanese) ロケール上でのみ動作が保証されます。] を提供しています。この章では次の項目について説明します。
libjapanese.a およびそれに関連する次のヘッダファイルは、将来のリリースでは 提供されません。新規アプリケーションには、前項までに説明した XPG などの標準関数 を使用してください。すでにlibjapanese.a を使用しているアプリケーションプログラムは ソース互換性を保つための代替関数及びマクロを、ソースファイルにて提供します。 詳細は、SUNWjlibj パッケージに含まれる(Entire インストールのみ含まれる) /usr/share/src/libjapanese/README を参照してください。
日本語専用ライブラリの使い方
各関数の簡単な説明と使用例
各関数に関する詳しい説明は、JFP 関係のマニュアルページを参照してください。
JFP には、日本語特有の機能を実現する日本語専用ライブラリが含まれています。
一般に、このライブラリに含まれている関数は、プログラムのロケールがシステムで定義された ja またはそれに相当する日本語ロケールに設定されていることを前提としています。したがって、このライブラリの関数と SunOS 標準の国際化関数を同時に使ったプログラムが日本語データに関して一貫した動作をするためには、プログラムの始めに setlocale(3C) 関数が呼ばれ、これを通じてプログラムのロケールが適当な日本語ロケールに設定される必要があります。
また、日本語専用ライブラリには、JIS コード、EUC、PC 漢字 (MS 漢字、シフト JIS とも呼ばれる) コード間などのコード変換を行う関数も定義されています。
次の関数を使用する場合には、コンパイル時に -ljapaneses) オプションを指定して、日本語専用ライブラリをリンクしてください。
これらの関数のほとんどは、SunOS 5.6 の標準ライブラリlibc のワイド文字列処理関数に基づくマクロです。ここで説明する関数は、過去の日本語システムの日本語用ライブラリ仕様と互換性を保つために提供されています。これらの関数を使用するためにはwidec.h ではなく、/usr/include/wstring.h を取り込んでください。ワイド文字列処理関数 (マクロ) を表 A-1 に示します。
表 A-1 ワイド文字列処理関数
関数 |
機能 |
---|---|
文字列を追加します |
|
指定文字数分だけ文字列を追加します |
|
文字列同士の比較を行います |
|
指定文字数分だけ文字列同士の比較を行います |
|
文字列をコピーします |
|
指定文字数分だけ文字列をコピーします |
|
malloc を使って文字列をコピーします |
|
指定文字が最初に現れた文字位置を返します |
|
指定文字が最後に現れた文字位置を返します |
|
指定文字列で構成される最初の長さを返します |
|
指定文字列以外で構成される最初の長さを返します |
|
指定文字列内の文字が最初に現れた文字位置を返します |
|
文字列の文字数を返します |
|
指定文字で分離される文字列を切り出します |
また、次の表 A-2 で示す関数は、国際化機能に基づかない日本語固有の日本語処理を含んでおり、libjapanese で提供されます。
表 A-2 日本語固有のワイド文字列処理関数
関数 |
機能 |
---|---|
主および補助コードセット文字列を long 整数に変換します |
|
主および補助コードセット文字列を倍精度に変換します |
例 A-1 に、このワイド文字列処理関数を使って、標準入力ファイル内の主および補助コードセットで書かれた数の合計を計算するプログラム例を紹介します。このプログラムでは、getws(3I) 関数で行単位にファイルを読み込んだ後、wstrpbrk(3X) を操作させて整数を求めています。
sun% cat example1.c #include <stdio.h> #include <locale.h> #include <wstring.h> main() { int total = 0; long token; wchar_t wbuf[256]; wchar_t *wptr; static char *number = "01234567890123456789"; static wchar_t wnumber[21]; setlocale(LC_ALL, ""); if (mbstowcs(wnumber, number, 20) <= 0) { printf("数字列が認識できません。¥n"); exit(1); } while (getws(wbuf) != NULL) { wptr = wbuf; while (wptr && *wptr) { wptr = wstrpbrk(wptr, wnumber); if (wptr) { token = wstrtol(wptr, &wptr, 10); printf("トークンの値 = [%d]¥n", token); total += token; } } } printf("合計は %d です。¥n", total); } sun% cat 入力ファイル 1 343 34534 345345 345345 39857 398 5834589 sun% cc -o example1 example1.c -lw -ljapanese sun% ./example1 < 入力ファイル 1 トークンの値 = [343] トークンの値 = [34534] トークンの値 = [345345] トークンの値 = [345345] トークンの値 = [39857] トークンの値 = [398] トークンの値 = [5834589] 合計は 6600411 です。 sun%
日本語専用ライブラリでは、単一バイト変換関数 (toupper、tolower) と同様な変換関数を JIS X 0208、JIS X 0201、 JIS X 0212 に相当する日本語文字専用に提供しています。さらに、ASCII 文字セットと日本語文字間での変換、区点コード変換など、日本語特有の変換を行う関数も提供しています。これらの関数を使用する場合は /usr/include/jctype.h を取り込んでください。
表 A-3 ワイド文字変換用関数
関数 |
機能 |
---|---|
JIS X 0208、JIS X 0212 で定義されるアルファベット小文字を表すワイド文字を対応する大文字を表すワイド文字に変換します |
|
JIS X 0208、JIS X 0212 で定義されるアルファベット大文字を表すワイド文字を対応する小文字を表すワイド文字に変換します |
|
JIS X 0208 で定義されるカタカナ文字、カタカナ繰返し記号を表すワイド文字を対応するひらがな文字、ひらがな繰返し記号を表すワイド文字に変換します |
|
JIS X 0208 で定義されるひらがな文字、ひらがな繰返し記号を表すワイド文字を対応するカタカナ文字、カタカナ繰返し記号を表すワイド文字に変換します |
|
ASCII 文字、または JIS X 0201 カタカナ用図形文字で定義される文字を表すワイド文字を対応する JIS X 0208 で定義される文字を表すワイド文字に変換します |
|
JIS X 0208 で定義される文字を表すワイド文字を対応する ASCII 文字、または JIS X 0201 カタカナ用図形文字で定義される文字を表すワイド文字に変換します |
|
ワイド文字表現に使用しないすべてのビットをオフにして、 wchar_t 型に変換します |
|
区点番号からワイド文字に変換します |
例 A-2 に、これらのワイド文字変換用関数を使用して、JIS X 0208 のカタカナ文字をひらがな文字に変換するプログラム例を示します。このプログラム例では、getws(3I) 関数で行単位にファイルを読み込んだ後に、tojhira(3X) 関数を用いてカタカナ文字をひらがな文字に変換しています。
sun% cat example2.ccat example2.c #include <stdio.h> #include <locale.h> #include <jctype.h> main() { wchar_t wbuf[1024]; wchar_t *wptr, c; setlocale(LC_ALL, ""); while (getws(wbuf) != NULL) { wptr = wbuf; while (*wptr) { c = tojhira(*wptr++); putwc(c, stdout); } putchar('¥n'); } } sun% cat input_file2cat input_file2 コレハ、カタカナヲひらがなニ変換スル サンプルプログラムデス。 「ヴヵヶ」ハ、変換サレマセン。 クリカエシキゴウ - ヾヽ sun% cc -o example2 example2.c -lwcc -o example2 example2.c -lw sun% ./example2 < input_file2 これは、かたかなをひらがなに変換する さんぷるぷろぐらむです。 「ヴヵヶ」は、変換されません。 くりかえしきごう - ゞゝ sun%
日本語専用ライブラリでは、文字を分類する機能を提供しています。これらの関数を使用する場合は、/usr/include/jctype.h を取り込んでください。
表 A-4 ワイド文字分類関数
関数 |
機能 |
---|---|
JIS X 0208 で定義される文字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される英語のアルファベット文字を表すワイド文字のとき、真を返します |
|
JIS X 0208、JIS X 0212 で定義されるアルファベットの大文字を表 すワイド文字のとき、真を返します |
|
JIS X 0208、JIS X 0212 で定義されるアルファベットの小文字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される数字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される空白文字を表すワイド文字のとき、真を返します |
|
JIS X 0208、JIS X 0212 で定義される記述記号を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される括弧記号を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される罫線けい線素片を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される単位記号を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される学術記号を表すワイド文字のとき、真を返します |
|
JIS X 0208、JIS X 0212 で定義される一般記号を表すワイド文字のとき、真を返します |
|
JIS X 0208、JIS X 0212 で定義される漢字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義される特殊文字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義されるギリシャ文字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義されるロシア文字を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義されるカタカナ、濁点、半濁点、長音記号、カタカナ繰返し記号を表すワイド文字のとき、真を返します |
|
JIS X 0208 で定義されるひらがな、濁点、半濁点、長音記号、ひらがな繰返し記号を表すワイド文字のとき、真を返します |
|
JIS X 0201 で定義されるカタカナ用図形文字に属する文字を表すワイド文字のとき、真を返します |
|
isjhankana() |
isj1bytekana() と同様 |
次に、これらのワイド文字分類関数を使用して、JIS X 0208 の英語のアルファベット文字と数字を、ASCII の英語のアルファベットと数字に変換するプログラムを紹介します。このプログラム例では、getws(3I) 関数で行単位にファイルを読み込んだ後に、isjalpha(3X) と isjdigit(3X) でワイド文字を分類し、jistoa(3X) 関数を用いて ASCII に変換しています。
sun% cat example3.c #include <stdio.h> #include <locale.h> #include <jctype.h> main() { wchar_t wbuf[1024]; wchar_t *wptr; setlocale(LC_ALL, ""); while (getws(wbuf) != NULL) { wptr = wbuf; while (*wptr) { if (isjdigit(*wptr) || isjalpha(*wptr)){ printf(%"wc", jistoa(*wptr)); }else { printf(%"wc", *wptr); } *wptr++; } putchar('¥n'); } } sun% cat input_file3 Sun Microsystems 0123456789 sun% cc -o example3 example3.c -lw -ljapanese sun% ./example3 < input_file3 Sun Microsystems 0123456789 sun%
日本語専用ライブラリでは、JIS X 0208 文字集合のコード変換機能を提供しています。これらの関数は、JIS X 0208 (jis)、日本語 EUC コード (uj)、PC 漢字コード (sj) 間でコードの変換を行うものです。これらの関数を使用する場合は、/usr/include/jcode.h を取り込んでください。cjistosj(3X) や cujtosj(3X) などの 1 文字コード変換用関数は、JIS X 0208 の漢字セット、および JIS X 0201 のアルファベット文字またはかな文字のセットで定義され、JIS X 0208-1983 文字セットの指示は「ESC$B」、JIS X 0201-1976 文字セットの指示は「ESC (J」のシーケンスによって、それぞれ行われます。
表 A-5 コード変換用関数
例 A-4 に、このコード変換用関数を用いて、EUC から JIS コードへコード変換するプログラム例を示します。
sun% cat example4.c #include <stdio.h> #include <jcode.h> main() { char inbuf[2048]; char outbuf[2048]; while(gets(inbuf) != NULL) { ujtojis(outbuf, inbuf); puts(outbuf); } } sun% cc -o example4 example4.c -ljapanese sun% cat 入力ファイル4 これは、コード変換のテスト用に作成したファイルです。 いかがでしょう。 sun% ./example4 < 入力ファイル4 | jistoeuc これは、コード変換のテスト用に作成したファイルです。 いかがでしょう。 sun%
また、IBM 漢字コードと日本語 EUC コード間のコード変換を行うため、一連の関数が提供されています (ibmjcode(3X) 参照)。これらの関数を使用する場合には、/usr/include/ibmjcode.h を取り込んでください。