日本語文字列処理ツールとは、日本語文字列を解析する場合に有効なツールです。
汎用的なコマンドとしては、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; /* 読込みバッファ */ |