JFP 開発ガイド

付録 A 日本語専用ライブラリ (libjapanese.a)

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) オプションを指定して、日本語専用ライブラリをリンクしてください。

cjistosj(), cjistouj(), cujtojis(), cujtosj(), csjtojis(),
csjtouj(), jis7tosj(), jis7touj(), sjtojis7(), ujtojis7(),
jis8tosj(), jis8touj(), sjtojis8(), ujtojis8(), jistosj(),
istouj(), ujtojis(), ujtosj(), sjtojis(), sjtouj, wstrtol(),
wstrtod()

ワイド文字列処理関数

これらの関数のほとんどは、SunOS 5.6 の標準ライブラリlibc のワイド文字列処理関数に基づくマクロです。ここで説明する関数は、過去の日本語システムの日本語用ライブラリ仕様と互換性を保つために提供されています。これらの関数を使用するためにはwidec.h ではなく、/usr/include/wstring.h を取り込んでください。ワイド文字列処理関数 (マクロ) を表 A-1 に示します。

表 A-1 ワイド文字列処理関数

関数

機能

wstrcat()

文字列を追加します 

wstrncat()

指定文字数分だけ文字列を追加します 

wstrcmp()

文字列同士の比較を行います 

wstrncmp()

指定文字数分だけ文字列同士の比較を行います 

wstrcpy()

文字列をコピーします 

wstrncpy()

指定文字数分だけ文字列をコピーします 

wstrdup()

malloc を使って文字列をコピーします

wstrchr()

指定文字が最初に現れた文字位置を返します 

wstrrchr()

指定文字が最後に現れた文字位置を返します 

wstrspn()

指定文字列で構成される最初の長さを返します 

wstrcspn()

指定文字列以外で構成される最初の長さを返します 

wstrpbrk()

指定文字列内の文字が最初に現れた文字位置を返します 

wstrlen()

文字列の文字数を返します 

wstrtok()

指定文字で分離される文字列を切り出します 

また、次の表 A-2 で示す関数は、国際化機能に基づかない日本語固有の日本語処理を含んでおり、libjapanese で提供されます。

表 A-2 日本語固有のワイド文字列処理関数

関数

機能

wstrtol()

主および補助コードセット文字列を long 整数に変換します 

wstrtod()

主および補助コードセット文字列を倍精度に変換します 

例 A-1 に、このワイド文字列処理関数を使って、標準入力ファイル内の主および補助コードセットで書かれた数の合計を計算するプログラム例を紹介します。このプログラムでは、getws(3I) 関数で行単位にファイルを読み込んだ後、wstrpbrk(3X) を操作させて整数を求めています。


例 A-1 ワイド文字列処理関数

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%

ワイド文字変換用関数 (jconv)

日本語専用ライブラリでは、単一バイト変換関数 (touppertolower) と同様な変換関数を JIS X 0208、JIS X 0201、 JIS X 0212 に相当する日本語文字専用に提供しています。さらに、ASCII 文字セットと日本語文字間での変換、区点コード変換など、日本語特有の変換を行う関数も提供しています。これらの関数を使用する場合は /usr/include/jctype.h を取り込んでください。

表 A-3 ワイド文字変換用関数

関数

機能

tojupper ()

JIS X 0208、JIS X 0212 で定義されるアルファベット小文字を表すワイド文字を対応する大文字を表すワイド文字に変換します 

tojlower()

JIS X 0208、JIS X 0212 で定義されるアルファベット大文字を表すワイド文字を対応する小文字を表すワイド文字に変換します 

tojhira()

JIS X 0208 で定義されるカタカナ文字、カタカナ繰返し記号を表すワイド文字を対応するひらがな文字、ひらがな繰返し記号を表すワイド文字に変換します 

tojkata()

JIS X 0208 で定義されるひらがな文字、ひらがな繰返し記号を表すワイド文字を対応するカタカナ文字、カタカナ繰返し記号を表すワイド文字に変換します 

atojis()

ASCII 文字、または JIS X 0201 カタカナ用図形文字で定義される文字を表すワイド文字を対応する JIS X 0208 で定義される文字を表すワイド文字に変換します 

jistoa()

JIS X 0208 で定義される文字を表すワイド文字を対応する ASCII 文字、または JIS X 0201 カタカナ用図形文字で定義される文字を表すワイド文字に変換します 

toujis()

ワイド文字表現に使用しないすべてのビットをオフにして、 wchar_t 型に変換します 

kutentojis()

区点番号からワイド文字に変換します 

例 A-2 に、これらのワイド文字変換用関数を使用して、JIS X 0208 のカタカナ文字をひらがな文字に変換するプログラム例を示します。このプログラム例では、getws(3I) 関数で行単位にファイルを読み込んだ後に、tojhira(3X) 関数を用いてカタカナ文字をひらがな文字に変換しています。


例 A-2 ワイド文字変換用関数

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%

ワイド文字分類関数 (jctype)

日本語専用ライブラリでは、文字を分類する機能を提供しています。これらの関数を使用する場合は、/usr/include/jctype.h を取り込んでください。

表 A-4 ワイド文字分類関数

関数

機能

isjis()

JIS X 0208 で定義される文字を表すワイド文字のとき、真を返します 

isjalpha()

JIS X 0208 で定義される英語のアルファベット文字を表すワイド文字のとき、真を返します 

isjupper()

JIS X 0208、JIS X 0212 で定義されるアルファベットの大文字を表 すワイド文字のとき、真を返します 

isjlower()

JIS X 0208、JIS X 0212 で定義されるアルファベットの小文字を表すワイド文字のとき、真を返します 

isjdigit()

JIS X 0208 で定義される数字を表すワイド文字のとき、真を返します 

isjspace()

JIS X 0208 で定義される空白文字を表すワイド文字のとき、真を返します 

isjpunct()

JIS X 0208、JIS X 0212 で定義される記述記号を表すワイド文字のとき、真を返します 

isjparen()

JIS X 0208 で定義される括弧記号を表すワイド文字のとき、真を返します 

isjline()

JIS X 0208 で定義される罫線けい線素片を表すワイド文字のとき、真を返します 

isjunit()

JIS X 0208 で定義される単位記号を表すワイド文字のとき、真を返します 

isjsci()

JIS X 0208 で定義される学術記号を表すワイド文字のとき、真を返します 

isjgen()

JIS X 0208、JIS X 0212 で定義される一般記号を表すワイド文字のとき、真を返します 

isjkanji()

JIS X 0208、JIS X 0212 で定義される漢字を表すワイド文字のとき、真を返します 

isjspecial()

JIS X 0208 で定義される特殊文字を表すワイド文字のとき、真を返します 

isjgreek()

JIS X 0208 で定義されるギリシャ文字を表すワイド文字のとき、真を返します 

isjrussian()

JIS X 0208 で定義されるロシア文字を表すワイド文字のとき、真を返します 

isjkata()

JIS X 0208 で定義されるカタカナ、濁点、半濁点、長音記号、カタカナ繰返し記号を表すワイド文字のとき、真を返します 

isjhira()

JIS X 0208 で定義されるひらがな、濁点、半濁点、長音記号、ひらがな繰返し記号を表すワイド文字のとき、真を返します 

isj1bytekana()

JIS X 0201 で定義されるカタカナ用図形文字に属する文字を表すワイド文字のとき、真を返します 

isjhankana()

isj1bytekana() と同様

次に、これらのワイド文字分類関数を使用して、JIS X 0208 の英語のアルファベット文字と数字を、ASCII の英語のアルファベットと数字に変換するプログラムを紹介します。このプログラム例では、getws(3I) 関数で行単位にファイルを読み込んだ後に、isjalpha(3X)isjdigit(3X) でワイド文字を分類し、jistoa(3X) 関数を用いて ASCII に変換しています。


例 A-3 ワイド文字分類関数

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%

x86: コード変換用関数 (jisconv、ibmjcode)

日本語専用ライブラリでは、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 コード変換用関数

関数

機能

cjistosj()

漢字の JIS 文字 1 文字を PC 漢字文字に変換します 

cjistouj()

漢字の JIS 文字 1 文字を日本語 EUC コード文字に変換します 

cujtojis()

漢字の日本語 EUC コード文字 1 文字を JIS 文字に変換します 

cujtosj()

漢字の日本語 EUC コード文字 1 文字を PC 漢字文字に変換します 

csjtojis()

PC 漢字文字 1 文字を JIS 文字に変換します 

csjtouj()

PC 漢字文字 1 文字を日本語 EUC コード文字に変換します 

jis7tosj()

7 ビット JIS 文字の文字列を PC 漢字文字の文字列に変換します 

jis7touj()

7 ビット JIS 文字の文字列を日本語 EUC コード文字の文字列に変換します 

sjtojis7()

PC 漢字文字の文字列を 7 ビット JIS 文字の文字列に変換します 

ujtojis7()

日本語 EUC コード文字の文字列を 7 ビット JIS 文字の文字列に変換します 

jis8tosj()

8 ビット JIS 文字の文字列を PC 漢字文字の文字列に変換します 

jis8touj()

8 ビット JIS 文字の文字列を日本語 EUC コード文字の文字列に変換します 

sjtojis8()

PC 漢字文字の文字列を 8 ビット JIS 文字の文字列に変換します 

ujtojis8()

日本語 EUC コード文字の文字列を 8 ビット JIS 文字の文字列に変換します 

jistosj()

jis8tosj() と同じです

jistouj()

jis8touj() と同じです

ujtojis()

ujtojis8() と同じです

ujtosj()

日本語 EUC コード文字の文字列を PC 漢字文字の文字列に変換します 

sjtojis()

sjtojis8() と同じです

sjtouj()

PC 漢字文字の文字列を日本語 EUC コード文字の文字列に変換します 

例 A-4 に、このコード変換用関数を用いて、EUC から JIS コードへコード変換するプログラム例を示します。


例 A-4 コード変換用関数

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 を取り込んでください。