3. 文字集合の扱い

skf での文字集合は、B-Right/V 以外の文字集合を扱う場合には、以下のように階層で管理される。これは skf の中だけの定義。

 (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 で、文字エンコーディング (charset) として指定される文字集合
   
  以下、内部のハンドリングを順に説明する。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 定義に即して全体が８種類に大別され、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) オーバレイ文字集合

  skf 内部での charset の実際の表現 (指示する際の指定方法) は、上記のうちのどのカテゴリに属しているか、つぎに具体的な charset 名 (実際はカテゴリ内の構造体配列のインデクスで) で、暗示的に指示され、構造体内には直接指定するための情報は持たない。内部的には、上記のカテゴリ配列 iso_byte_defs_entry の index と、カテゴリ内の配列内の index) の二添字で skf 内では識別される。また、各 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 にある。skf 内部では、この構造体配列内の index を codeset を同一視して持ち回っている。

/* --------------------------------------------------------------- */
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 には１バイト文字集合のみ指定可能である。
  実際の出力に関しては、出力生成に関する章を参照のこと。

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_index, 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 を用い、Alias は skf.c で ic, oc 用の指定文字列と合わせて定義されている。

