JFP 開発ガイド

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

JFP では、日本語固有の処理を行うために、libjapanese.a [「はじめに」でも述べましたが、ここで紹介するインタフェースは、ja (または japanese) ロケール上でのみ動作が保証されます。] が提供されています。この付録では、次の項目について説明します。


注 -

libjapanese.a と、これに関連する次のヘッダーファイルは、将来のリリースでは提供されません。新規アプリケーションには、前項までに説明した XPG などの標準関数を使用してください。すでに libjapanese.a を使用しているアプリケーションプログラムは、ソースファイルを使って、ソースの互換性を保つための代替関数とマクロを提供します。 詳細は、SUNWjlibj パッケージに含まれる(Entire インストールにのみ含まれる) /usr/share/src/libjapanese/README を参照してください。


各関数に関する詳しい説明は、JFP 関係のマニュアルページを参照してください。

概説

JFP には、日本語特有の機能を実現する日本語専用ライブラリが含まれています。

一般に、このライブラリに含まれている関数は、プログラムのロケールがシステムで定義された ja または japanese ロケールに設定されていることを前提としています。したがって、このライブラリの関数と 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.8 の標準ライブラリ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(3C) 関数で行単位にファイルを読み込んだ後、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(3C) 関数で行単位にファイルを読み込んだ後に、tojhira(3X) 関数を使ってカタカナ文字をひらがな文字に変換しています。


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

sun% cat 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_file2
コレハ、カタカナヲひらがなニ変換スル
サンプルプログラムデス。
「ヴヵヶ」ハ、変換サレマセン。
クリカエシキゴウ - ヾヽ
sun% cc -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(3C) 関数で行単位にファイルを読み込んだ後に、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%

コード変換用関数 (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 を取り込んでください。