JFP 開発ガイド

プログラム例

ここでは、日本語文字分類 API を使用したプログラム例を紹介します。この場合も前述の文字対応 API の場合と同様に、wchar.h ヘッダーファイルを取り込み、処理の最初の段階で setlocale() を呼び出して、動作ロケールを適切に設定する必要があります。

例 3-3 では、入力ファイルをワイド文字列として読み込んで入力中の JIS X 0208 ひらがなとカタカナを交換し、JIS X 0208 数字文字を ASCII に変換して出力します。


例 3-3 文字分類 API

sun% cat my_charconv.c
/*
 * Read lines from a file and convert JIS X 0208 hiragana
 * characters to JIS X 0208 katakana characters, and
 * vice versa. In addition, JIS X 0208 digit characters
 * are converted to the correspondent ones in JIS X 0201
 * characters.
 * Conversion will stop if the input file reaches EOF.
 * It is assumed that each line has at most BUFSIZ - 1
 * wide char length.
 *
 * Actual conversion is done by my_charconv(), which does
 * the followings.
 *	1.	Get the length of the wide string.
 *	2.	Convert each wide char from the top
 *		of the string by applying towctrans().
 *		(The return value of towctrans() will be
 *		the same if there's no correspondent char.)
 *	3.	Write the correspondent wide char to
 *		original string and output it.
 */

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>
#include <jctype.h>
#include <errno.h>

#define			WRET		L'¥n'

static int my_charconv(wchar_t *);

int
main(int argc, char *argv[])
{
	wchar_t buf[BUFSIZ];
	wchar_t *headp, *nextp;
	long retval, total;

	setlocale(LC_ALL, "");
	total = retval = 0;

while (fgetws(buf, BUFSIZ, stdin) != (wchar_t *)NULL) {
		retval = my_charconv(buf);
		if (retval == -1) {
			perror("my_charconv()");
			exit(-1);
		}
		fprintf(stdout, "%S", buf);
	}

	return (0);
}

static int
my_charconv(wchar_t *wcp)
{
	size_t wstr_len;
	wint_t retval;
	int index;
	long ret_val;

	wstr_len = wcslen(wcp);
	for (index = 0; index < wstr_len; index++) {
		errno = 0;
		if (iswctype((wint_t)wcp[index], wctype("jhira")))
			retval = towctrans((wint_t)wcp[index], wctrans("tojkata"));
		else if (iswctype((wint_t)wcp[index], wctype("jkata")))
			retval = towctrans((wint_t)wcp[index], wctrans("tojhira"));
		else if (iswctype((wint_t)wcp[index], wctype("jdigit")))
			retval = towctrans((wint_t)wcp[index], wctrans("tojisx0201"));
		else
			retval = wcp[index];

		if (errno != 0)
			return (-1);
		wcp[index] = (wchar_t)retval;
	}

	return (0);
}
sun% cat file5
ひらがなはかたかなに置換されます。
カタカナハヒラガナニ置換サレマス。
漢字、記号、全角alphabetや
JIS X 0201 カナナドハ* 置換 サレマセン*。
sun% cc -o my_charconv my_charconv.c
sun% ./my_charconv < file5
ヒラガナハカタカナニ置換サレマス。
かたかなはひらがなに置換されます。
漢字、記号、全角alphabetヤ
JIS X 0201 カナナドハ* 置換 サレマセン*。	


注意 - 注意 -

* の部分のカタカナは、半角カタカナになります。