Desenvolver e Download de Software Open Source

View 3. charset/codeset handling

category(Tag) tree

file info

category(Tag)
root
file name
charset.txt
última actualização
2007-01-08 19:30
tipo
Plain Text
editor
Seiji Kaneko
descrição
linguagem
Japanese
translate
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 用の指定文字列と合わせて定義されている。