日本語文字列処理ツール

 日本語文字列処理ツールとは、日本語文字列を解析する場合に有効なツールです。 汎用的なコマンドとしては、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進ダンプ機能があります。 以下に、そのコマンドの使い方を示します。
 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);
}

バイトモードによる16進ダンプの表示

 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);_}_

表示幅を変更した16進ダンプの表示

 表示幅を変更することで、表示する情報量を多くすることができます。

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);_}_

ラインモードによる16進ダンプの表示

 ラインモードでは、ソースの行番号と対応して表示できます。

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行モードによる文字と文字コードの対応表示

 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; /* 読込みバッファ */


Copyright (C)1998-1999 ASH multimedia lab.
mail : info@ash.jp