日本語文字列処理ツールとは、日本語文字列を解析する場合に有効なツールです。
汎用的なコマンドとしては、16進ダンプ機能のみです。
共通関数は、ライブラリ形式としているため、他のプログラムから呼び出して使うことができます。
文字判定を行っているため、文字コードチェックツールや、文字コード変換ツールなどへ応用することもできます。
文字コードについての解説は、文字コードについてを参照してください。
文字コードのサポート状況などは、制限事項を見てください。
現在は、EUCのみですが、2000年3月公開を目標に、JIS, SJIS, Unicode (UTF-8, UTF-16)に対応中です。
日本語文字列処理ライブラリとツールには、以下のファイルがあります。
ソースファイルは、ダウンロードすることができます。
メイク方法は、メイクファイルを参照してください。
一括ダウンロード(xd.tar.gz)もできます。
| Cソース | 関連ヘッダ | 説明 |
|---|---|---|
| xd.c | 16進ダンプツール | |
| libstr.c | libstr.h | 文字列状態判定共通処理 |
| libfile.c | libfile.h | ファイルアクセス共通処理 |
| makefile | メイクファイル |
展開、インストールは、以下の手順で行います。
/usr/local/pub ダウンロードしたファイルを格納する場所 /usr/local/src ファイル展開、メイクなどを実施する場所 unix# cd /usr/local/src unix# gzip -cd ../pub/xd.tar.gz | tar -xvf - unix# cd xd unix# make unix# cp xd /usr/local/bin/. |
日本語文字列処理ツールのコマンドには、16進ダンプ機能があります。
以下に、そのコマンドの使い方を示します。
16進ダンプコマンドの特徴は、ラインモードがある点と、表示幅が可変にできる点です。
日本語が正しく表示されない問題は、修正しました。(2000/02/22)
Unicode(UTF-8, UTF-16)対応版も、開発中です。
| xd.c |
|---|
/**********************/ /* ヘキサ(16進)ダンプ */ /**********************/ hd [-j|s|e|u] [-l] [-2] [-w width] files 機能 16進ダンプする。 -jオプションで、JISコードとして表示する。 -sオプションで、SJISコードとして表示する。 -eオプションで、EUCコードとして表示する。 -uオプションで、Unicodeとして表示する。 -lオプションを付けるとラインモードで出力する。 ラインモードでは、改行コードで折り返すため、テキストファイルとの比較が容易にできる。 -2オプションで、文字ードと文字を2行で表示して対応して表示できる。 -wオプションで、表示幅を広げることができる。 形式 以下の形式で表示する。 99999999: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff #表示文字列 制限事項 Unicodeには未対応 |
文字コードの判定は、EUCコードとSJISコードの自動判定ができない場合があります。 この場合は、Unknown(EUC/SJIS) と表示します。
以下のソースファイルを、各種モードで16進ダンプしたイメージです。
ラインモードでは、ソースと行の対応が取れるので、目的のデータを簡単に見つけることができます。
ラインモードでは、先頭行のみソースの行番号を表示されます。
改行、タブなどの制御コードは、_で表示します。また、バイナリデータは、@で表示します。
unix# cat test.c
/* TEST */
main()
{
printf("16進dump"\n);
}
|
1行毎に各文字の文字コードと文字のイメージが表示されます。
unix# xd test.c
00000000: 2f 2a 20 54 45 53 54 20 2a 2f 0a 0a 6d 61 69 6e :/* TEST */__main
00000010: 28 29 0a 7b 0a 20 20 70 72 69 6e 74 66 28 22 31 :()_{_ printf("1
00000020: 36 bf ca 64 75 6d 70 22 5c 6e 29 3b 0a 7d 0a -- :6進dump"\n);_}_
|
表示幅を変更することで、表示する情報量を多くすることができます。
unix# xd -w24 test.c
00000000: 2f 2a 20 54 45 53 54 20 2a 2f 0a 0a 6d 61 69 6e 28 29 0a 7b 0a 20 20 70 :/* TEST */__main()_{_ p
00000018: 72 69 6e 74 66 28 22 31 36 bf ca 64 75 6d 70 22 5c 6e 29 3b 0a 7d 0a -- :rintf("16進dump"\n);_}_
|
ラインモードでは、ソースの行番号と対応して表示できます。
unix# xd -l test.c
00000001: 2f 2a 20 54 45 53 54 20 2a 2f 0a -- -- -- -- -- :/* TEST */_
00000002: 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- :_
00000003: 6d 61 69 6e 28 29 0a -- -- -- -- -- -- -- -- -- :main()_
00000004: 7b 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- :{_
00000005: 20 20 70 72 69 6e 74 66 28 22 31 36 bf ca 64 75 : printf("16進du
--------: 6d 70 22 5c 6e 29 3b 0a -- -- -- -- -- -- -- -- :mp"\n);_
00000006: 7d 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- :}_
|
2行モードでは、文字コードと文字の対応が簡単にできます。
unix# xd -2 test.c
00000000: 2f 2a 20 54 45 53 54 20 2a 2f 0a 0a 6d 61 69 6e
: / * T E S T * / _ _ m a i n
00000010: 28 29 0a 7b 0a 20 20 70 72 69 6e 74 66 28 22 31
: ( ) _ { _ p r i n t f ( " 1
00000020: 36 bf ca 64 75 6d 70 22 5c 6e 29 3b 0a 7d 0a --
: 6 進 d u m p " \ n ) ; _ } _
|
複数のオプションを組み合わせることで、見やすく表示できます。
unix# xd -l2w24 test.c
00000001: 2f 2a 20 54 45 53 54 20 2a 2f 0a -- -- -- -- -- -- -- -- -- -- -- -- --
: / * T E S T * / _
00000002: 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
: _
00000003: 6d 61 69 6e 28 29 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
: m a i n ( ) _
00000004: 7b 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
: { _
00000005: 20 20 70 72 69 6e 74 66 28 22 31 36 bf ca 64 75 6d 70 22 5c 6e 29 3b 0a
: p r i n t f ( " 1 6 進 d u m p " \ n ) ; _
00000006: 7d 0a -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
: } _
|
日本語文字列処理共通関数では、文字コードを判定し、文字バイト数と表示桁数を求めます。
また、JISコードの場合は、エスケープシーケンスのモードも返却します。
以下に、その関数票を示します。
利用するためには、libstr.hをインクルードする必要があります。
| libstr.c |
|---|
/******************************/
/* 文字列の指定位置の状態判定 */
/******************************/
judge_char(code, mode, str, len, sta, byte, keta, kind)
int code; /* 文字コード (i) */
/* CD_JIS,CD_SJIS,CD_EUC,CD_UTF8,CD_UTF16 */
int *mode; /* JIS文字モード (i/o) */
/* JIS_CTRL,JIS_ROMA,JIS_KANA,JIS_KNJI,JIS_HOJO */
char *str; /* 入力文字列 (i) */
int len; /* 入力文字列バイト数 (i) */
int sta; /* 判定バイト位置 (i) */
int *byte; /* バイト数 (o) */
int *keta; /* 表示桁数 (o) */
int *kind; /* 文字の種類 (o) */
/* CH_BIN,CH_CTRL,CH_ROMA,CH_KANA,CH_KNJI,CH_HOJO */
|
ファイルアクセス共通関数では、先読みバッファを持ったデータを取得できます。
利用方法は、通常のopen, get, closeとほとんど同じです。
先読みバッファは、指定したサイズだけ読み込まれ、次のレコードを読み込む時には、次のレコードの先頭にコピーしてから、読み込みます。
メモリを検索している時に、ファイルのgetやungetをしなくてよくなるため、メモリ操作モジュールとの関数の共通化が図れます。
利用するためには、libfile.hをインクルードする必要があります。
| libfile.c |
|---|
/******************************************/ /* 先読みバッファ付きファイルアクセス関数 */ /******************************************/ /* バッファの初期処理 */ char *open_buf(cbuf, size, psize) struct tbuf *cbuf; /* 読込みバッファ */ int size; /* 読込みバッファサイズ */ int psize; /* 先読みバッファサイズ */ /* バッファの読込み処理 */ int get_buf(cbuf, fp) struct tbuf *cbuf; FILE *fp; /* バッファの終了処理 */ void close_buf(cbuf) struct tbuf *cbuf; /* 読込みバッファ */ |