3. 文字集合の扱い
skf での文字集合は、B-Right/V 以外の文字集合を扱う場合には、以下のように
階層で管理される。
(1) charset: 特定の文字を集めた集合の各要素に番号を振ったもの。いわゆる
符号化文字集合。
ex) ASCII, JIS X 0208(1990) など
(2) codeset: charset を最大 6 つ組にして、名前を付けたもの
ex) euc-JP など
また、外部から見える範囲は以下のような使い分けになる。
(1) charset
--set-g[0-3] で指定される文字集合
--show-supported-charset で表示される文字集合
(2) codeset
--ic,--oc で指定される文字集合
--show-supported-codeset で表示される文字集合
MIME で、エンコーディングとして指定される文字集合
以下、内部のハンドリングを順に説明する。B-Right/V の場合については別章
で説明する。
3.1 charset
skf で使う charset の定義は、in_code_table.c で配列構造、名前の両方が
定義されている。
また、外部テーブルを読み込むものに関しては、関連 charset のみが dyn_table.
c に定義されているが、文字集合に関する定義に関しては (過不足はあるが) in_code
_table.c と同じ文字集合の定義である (使うフィールドの関係で、dyn_table.
c の方には定義されていないものが多少ある)。また、charset は IANA 定義に
即して全体が8種類に大別され、skf 内部では (種類、種類内の通番) の二パラ
メータで個々の charset を認識している。
(1) IANA 定義 1-octet 94 文字集合
(2) IANA 定義 1-octet 96 文字集合
(3) IANA 定義 1-octet 94 文字中間バイトあり集合
(4) IANA 定義 マルチバイト 3-octet 94 文字集合
(5) IANA 定義 マルチバイト 4-octet 94 文字集合
(6) マイクロソフト/IBM/Apple コードセット文字集合 (skf-1.95 以降でのみ
存在)
(7) その他の文字集合
(8) オーバレイ文字集合
charset のエンコーディングは、上記のうちのどのカテゴリに属しているか、つ
ぎに具体的な charset 名で、暗示的に指示され、構造体内には直接指定するた
めの情報は持たない。また、各 charset は、内部に当該文字集合から Unicode
に変換するためのテーブルを持つ。その内部構造体定義は、convert.h 定義の
iso_byte_defs である。定義を以下に示す。
/* --------------------------------------------------------------- */
struct iso_byte_defs { /* coded charset definitions */
char defschar; /* final-byte-char in iso2022 */
short char_width; /* unicode table size + MB */
int table_len; /* unicode table entry limit */
/* this is for checking purpose. */
unsigned short *unitbl; /* points table iff char_width < 3*/
unsigned long is_kana; /* misc flags. see below */
skf_ucode *uniltbl;/* points table iff char_width = 4*/
unsigned short lang; /* language definition for codeset */
void (*hook)(); /* hook function for some fix. */
char *desc; /* description for this charset */
char *cname; /* canonical name for this charset */
};
3.1.1 defschar
IANA 定義の文字集合に関しては、呼び出しシーケンスの最終文字 (指示文字)
であり、それ以外では skf 内部で定義したものである。この文字は、skf で外
部テーブルを読み込む際のテーブルファイル名の一部として使用される。
3.1.2 char_width
1,2,4 のいずれかであり、各々以下の意味である。3.1.3 を参照のこと。
1: 元文字集合は 1-octet であり、変換先の Unicode のコード位置は U+10000
未満
2: 元文字集合は複数バイトであり、変換先の Unicode のコード位置は U+10000
未満
4: 元文字集合は複数バイトであり、変換先の Unicode のコード位置は U+10000
超
3.1.3 unitbl, uniltbl
元文字集合の番号を添字として用い、Unicode の符号位置を引くためのテーブ
ル。速度の関係で、変換先に U+10000 以上の符号位置が含まれる場合を uniltbl
に (skf_ucode の配列)、そうでない場合を unitbl に (unsigned short の配
列) に格納する。上記の 3.1.2 の定義と整合性がとれていない場合はクラッシ
ュするので、新規に定義する場合は注意。
3.1.4 table_len
3.1.3 のテーブルの配列の要素数。C 流に 0-origin であることに注意。元文
字集合が 1-octet の場合は通常 128 (その他の文字集合では 256 の場合がある)、
マルチバイト集合の場合は符号依存。
3.1.5 is_kana
その charset の持つ文字属性を設定するためのフィールドである。また、入
力テーブルのファイル名の生成に用いる文字属性を指定する。詳細は convert.
h 参照。
3.1.6 lang
その文字集合の意図している言語を指定する。iso-639-1 に、skf 内部で使用
するための作業用「言語」を加えたものである。定義は skf.h 中で行われてい
る。大別して以下の 4 種類がある。
1) iso-639-1 定義のもの: 名前二文字を、ラテン大文字二字で記載
2) L_NU ('NU'): 言語ニュートラルであることを示す
L_UNI, L_NUN: Unicode 判定での言語ニュートラルを示す
3) M_**: 強言語であることを示す。言語の扱いの節参照
のこと。
4) そのほか: 言語混在を示す定義がいくつか存在する。
3.1.7 desc, cname
desc はその文字集合の (説明付きの) 正式名。cname は文字集合として参照
されるときの代表名として使われる名称。cname は原則として IANA character
set, rfc-1345, Microsoft 社 Internet Explorer 文字集合名を、この順序の優
先順位でベースとして定義している。alias は、過去の経緯から skf.c で定義
されている。
3.1.8 hook
unitbl、uniltbl を動的に生成する文字集合の場合、テーブルを実際に生成す
るための関数を指すポインタ。この値が NULL でないとき、そのテーブルを最初
に使用する際に、使用前にこのポインタの指す関数が引数なしで呼ばれる。
3.2 codeset
skf で使用する codeset は、out_code_table.c 中で構造体定義されており、
入出力両方で用いる。構造体の定義は以下の通りで、定義自体は convert.h に
ある。
/* --------------------------------------------------------------- */
struct in_codeset_defs {
/* input side */
unsigned long encode; /* see below */
unsigned long alt_encode;
struct skf_codeset_point g0def; /* codeset presettings.. */
struct skf_codeset_point g0adef;
struct skf_codeset_point g1def;
struct skf_codeset_point g2def;
struct skf_codeset_point g3def;
/* output side */
struct skf_codeset_point ogldef; /* latin area additions */
unsigned long omap_typ; /* see below */
int o_iso_ascii_index; /* ucs2 -> codeset conversion tbl. */
int o_iso_latin_index;
int o_iso_symbol_index;
int o_iso_kana_index;
int o_iso_cjk_a_index;
int o_iso_kanji_index;
int o_iso_y_index;
int o_iso_hngl_index;
int o_iso_compat_index;
int o_iso_cjk_b_index;
int o_iso_cjk_c_index;
int o_iso_prv_index;
int o_iso_his_index;
int o_iso_note_index;
int o_iso_alt_index;
const long *o_patch;
unsigned long oconv_type;
unsigned short oconv_lang; /* two ASCIIs */
char *desc; /* description for this codeset */
char *cname; /* canonical name of the codeset */
};
3.2.1 g0def, g1def, g2def, g3def, g0adef, ogldef
codeset で使用する charset を定義する。g0def, g1def, g2def, g3def は、
順に iso-2022 の G1, G2, G3, G4 に当該 codeset で初期設定されている charset
を示す。g0adef は iso-2022-jp での JIS X 0208 のように、G0 に呼び出して
切り変え使用することを前提とする charset を設定する。
ogldef は、ラテン文字部を出力する際に用いる charset である。入力サイド
では用いない。
また、g0def には1バイト文字集合のみ指定可能である。
実際の出力に関しては、出力生成に関する章を参照のこと。
3.2.2 encode, alt_encode
出力時のエンコーディング方法を指定するパラメータの一つ。encode は、出
力時に使うルーチンの指定と、そのルーチンに与えるパラメータ指定の両方に使
われ、このパラメータに所定のマスクを行った値が、出力制御変数である conv_cap
にセットされる。alt_encode は現在未使用。
3.2.3 omap_typ
入出力時のエンコーディング方法を指定するパラメータの一つ。omap_typ で
指定するのは、3.2.1 で指定した各テーブルのハンドリング方法である。現在は
パラメータとして値をセットしているが、1.9x (<=1.95) では内部では未使用。
3.2.4 o_iso_ascii_index, o_iso_latin_index, o_iso_symbol_index, o_iso_kana_in
dex, o_iso_cjk_a_index, o_iso_kanji_index, o_iso_y_index, o_iso_hngl_index,
o_iso_compat_index, o_iso_cjk_b_index, o_iso_cjk_c_index, o_iso_prv_index,
o_iso_his_index, o_iso_note_index, o_iso_alt_index;
出力用の、Unicode から対象文字集合への変換テーブルを指定する。値は、対
応する領域に対する変換テーブルを格納する構造体配列へのインデックス、また
は -1 (テーブルがないことを示す) である。テーブルは領域毎に分かれており、
対応領域は以下の通り。
o_iso_ascii_index: U+000000 - U+00007f
o_iso_latin_index: U+0000a0 - U+001fff
o_iso_symbol_index: U+002000 - U+002fff
o_iso_kana_index: U+003000 - U+0033ff
o_iso_cjk_a_index: U+003400 - U+004dff
o_iso_kanji_index: U+004e00 - U+009fff
o_iso_y_index: U+00a000 - U+00abff
o_iso_hngl_index: U+00ac00 - U+00d7ff
o_iso_prv_index: U+00e000 - U+00f8ff
o_iso_compat_index: U+00f900 - U+00ffff
o_iso_his_index: U+010000 - U+011fff
o_iso_note_index: U+01d000 - U+01ffff
o_iso_cjk_b_index: U+020000 - U+02a6ff
o_iso_cjk_c_index: U+02f800 - U+02faff
o_iso_alt_index: 予備
3.2.5 o_patch
出力テーブルを動的に生成する codeset の、出力パッチテーブルを指すポイ
ンタである。charset 側と異なり関数ではない。パッチテーブルの構造について
は、テーブル生成の章参照。
3.2.6 oconv_type
出力テーブルのファイル名の生成に用いる文字属性を指定する。実際の文字集
合の文字属性と不一致となっている場合があるので注意。oconv.h に詳細定義が
ある。
3.2.7 lang
その文字集合の意図している言語を指定する。iso-639-1 に、skf 内部で使用
するための作業用「言語」を加えたものである。定義は skf.h 中で行われてお
り、charset の定義に優先する。大別して以下の 4 種類がある。
1) iso-639-1 定義のもの: 名前二文字を、ラテン大文字二字で記載
2) L_NU ('NU'): 言語ニュートラルであることを示す
L_UNI, L_NUN: Unicode 判定での言語ニュートラルを示す
3) M_**: 強言語であることを示す。言語の扱いの節参照
のこと。
4) そのほか: 言語混在を示す定義がいくつか存在する。
3.2.8 desc, cname
desc はその文字集合の (説明付きの) 正式名。cname は文字集合として参照
されるときの代表名として使われる名称。cname は原則として IANA character
set, rfc-1345, Microsoft 社 Internet Explorer 文字集合名を、この順序の優
先順位でベースとして定義している。MIME の検索には原則として cname を用い、Ali
as は skf.c で ic, oc 用の指定文字列と合わせて定義されている。