
\item 「m17n 言語情報ベース」の設計

多言語テキストを処理するためには多くの情報が必要となる。しかし、異なる
アプリケーションは異なる情報を利用するので、個々のアプリケーションプロ
グラムがどのような情報を必要とするかを、予め想定するのは不可能である。
そこで、必要な情報はアプリケーションプログラム開発者がデータベースとし
て用意し、本ライブラリは、その情報を元に動作するという方針を取る。

本ライブラリでは、このような言語情報のデータベースをまとめて管理し、デー
タベースへの統一的なアクセス方法を提供するために、「m17n 言語情報ベー
ス」を設計した。「m17n 言語情報ベース」は、「m17nライブラリ」自身や
「m17n ライブラリ」を用いるアプリケーションが利用できるデータベースの
集まりであり、便利で柔軟な API を通じて情報を得ることができる。また、
必要な場合には新しいデータベースを「m17n言語情報ベース」に付け加え、ア
プリケーションに情報を与えることもできる。

データベースの枠組みは、提供する情報の種類と形式、そしてその情報を取得
する方法によって決定される。今回の技術開発により、「m17n基本Cライブラ
リ」及び「m17n Xライブラリ」が利用する「m17n言語情報ベース」のスキーマ
\IPAref{database}、ならびにそれに含まれるデータベースを操作するための 
API群を設計した。

\begin{enumerate}
\item 「m17n言語情報ベース」のスキーマ

データベースは、情報を固有のフォーマットで表現する。「m17n言語情報ベー
ス」では、それに含まれるデータベース用に、汎用のフォーマットと特殊な
フォーマットの両方を提供することとした。

まず汎用のフォーマットとして、リスト構造（ネスト有り）を提供する。たと
えば、入力メソッドについての情報は、概念的には
\begin{verbatim}
	(PROMPT-STRING
           (STATE-NAME
             ("a" "あ")
             ("i" "い")
	     ...))
\end{verbatim}
というようなリスト構造によって表わすことができる。
（これはローマ字かな変換を行なう入力メソッドであり、3行目以降に変換ルー
ルが書かれている。）汎用フォーマットの場合、リストの各要素の意味は情報
の種類によって異なり、「m17n言語情報ベース」側では規定しない。各要素の定
義や整合性の保証は、データベースを利用する側で行なう必要がある。

この汎用的な形式は、その汎用性ゆえに効率が悪い。そこで特に大量のデータ
が必要になる文字ごとの固有の情報や、文字セットのマッピング情報に関して
は、次のような特別な形式を提供する。

m17n ライブラリおよびアプリケーションは、文字固有の情報を文字テーブル
に格納して利用する。そこで、データベースに含まれる情報のうち、文字コー
ドとそれに関するデータのテーブルは、直接文字テーブルオブジェクトとして
取得されるようにした。この種の情報は、特別なタグ `char-table' を第一
タグとして与えることで区別される。

文字セットのマッピング情報も、文字セットによるデコード／エンコード時に
必要となるものであるため、直接文字セットオブジェクトのなかのメンバとし
て取得する。文字毎の情報と同様に、この種の情報は、特別なタグ `charset' 
を第一タグとして指定することによって得られる。

「m17n言語情報ベース」から情報を引出す際には、どのような情報を持つデー
タベースが必要であるかを、タグを使って指示する。この際、情報自体の階層
性を利用して効率的な検索を行なうことができるよう設計した。たとえば「ピン
イン方式による中国語の入力メソッド」を考えてみよう。これは「ピンイン」
と「中国語」と「入力メソッド」という階層的な３つのタグで表わすことが自然
である\footnote{それだけでなく、単一タグとして指示するためには、これ
を表わすタグを生成する手間までかかってしまう。}。 m17n 言語情報ベースでは、
階層性を持つ複数のタグでデータベースを指定できるため、この場合には
\begin{quote}
\texttt{$<$chinese-input-method-using-pinyin$>$}
\end{quote}
といった単一タグではなく、
\begin{quote}
\texttt{$<$input-method chinese pinyin$>$}
\end{quote}
などとすることが可能である。

この枠組みを検証するために、m17n ライブラリ自体が直接使うデータベース
のうち、その利用方法などが現時点で明らかな以下のものを試作した。

\begin{description}

\item[コード変換のためのデータベース]~\\
多くの文字セットは、それに属する文字のコードポイントを対応する文字コー
ドに変換するデコードや、あるいはその逆の変換をするエンコードのために、
対応表（マップと呼ぶ）引きを行なう必要がある。以下のデータベースは、こ
の際に必要なデコード用とエンコード用のマップを与える。

  \begin{itemize}
  \item \textbf{タグ $<$\texttt{charset CHARSET_NAME}$>$ を持ち、\texttt{CHARSET_NAME}と
	いう名前の文字セットのエンコード／デコード用のマップを与えるデー
	タベース}
	
        Unicode コンソーシアムの提供する UnicodeData.txt、 Unihan.txt、 SpecialCasing.txt、
        IBM の International Components for Unicode、 安岡孝一氏による
        漢字テーブルと文字集合テーブルのリスト
        (http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/CJK.html) を基に、
        表\ref{TABLE:charsets}の 28 の文字セットそれぞれについてデータ
        ベースを試作した。

\begin{table}
\begin{tabular}{|l|l|}
\hline
CHARSET_NAME	& 文字セットの正式名称\\
\hline
iso-8859-2	& ISO/IEC 8859-2:1999\\
iso-8859-3	& ISO/IEC 8859-3:1999\\
iso-8859-4	& ISO/IEC 8859-4:1998\\
iso-8859-5	& ISO/IEC 8859-5:1999\\
iso-8859-6	& ISO/IEC 8859-6:1999\\
iso-8859-7	& ISO 8859-7:1987\\
iso-8859-8	& ISO/IEC 8859-8:1999\\
iso-8859-9	& ISO/IEC 8859-9:1999\\
iso-8859-10	& ISO/IEC 8859-10:1998\\
iso-8859-11	& ISO/IEC 8859-11:2001\\
iso-8859-13	& ISO/IEC 8859-13:1998\\
iso-8859-14	& ISO/IEC 8859-14:1998\\
iso-8859-15	& ISO/IEC 8859-15:1999\\
gb2312.1980	& GB2312-80\\
jisx0208.1983	& JIS X 0208-1983\\
KSC5601.1987	& KS C 5601-1987\\
jisx0212	& JIS X 0212-1990\\
jisx0201	& JIS X 0201-1976\\
viscii-1.1	& VIetnamese Standard Code for Information Interchange\\
big5		& Big Five\\
cns11643-1	& CNS 11643-1992, plane 1\\
cns11643-2	& CNS 11643-1992, plane 2\\
cns11643-3	& CNS 11643-1992, plane 3\\
cns11643-4	& CNS 11643-1992, plane 4\\
cns11643-5	& CNS 11643-1992, plane 5\\
cns11643-6	& CNS 11643-1992, plane 6\\
cns11643-7	& CNS 11643-1992, plane 7\\
cns11643-15	& CNS 11643-1992, plane 15\\
\hline
\end{tabular}
\caption{コード変換用データベースを試作した文字セット}
\label{TABLE:charsets}
\end{table}

  \end{itemize}

\item[文字列比較のためのデータベース]~\\
大文字と小文字の違いを無視しつつ文字列を比較する場合には、何らかの標準
形に変換してから比較する。普通は小文字に変換して比較するので、各文字に
それに対応する小文字を関連付けておく必要がある。

しかし、 m17n ライブラリで扱う Unicode 文字の中には、大文字と小文字が
単純な一対一対応にならない場合もある。たとえばドイツ語のエスツェットは、
小文字では `\ss' の一文字だが、大文字では `SS' の二文字で表わされる。

そこで、次の二種類のデータベースを用意した。

  \begin{itemize}
   \item \textbf{タグ $<$\texttt{char-table simple-case-folding}$>$ を持ち、
	各文字に対応する小文字を与えるデータベース}

	このデータベースは、標準形が小文字一文字になる文字に関するもの
	であり、CaseFolding.txt より試作した。

   \item \textbf{タグ $<$\texttt{char-table complicated-case-folding}$>$ を持ち、
	大文字／小文字を区別せずに比較する場合に置き換える小文字列
	を与えるデータベース}

	このデータベースは、標準形が複数の小文字の列になる文字に関する
	ものであり、CaseFolding.txt より試作した。

  \end{itemize}

この二本立てにより、通常は単純なデータベースのみを参照し、特殊な文字に
ついてのみ複雑なデータベースを参照するという、効率的な実装が可能である。
たとえばエスツェットに関する情報は単純なデータベースにはないため、この
文字についてのみ二つ目のデータベースを参照することになる。

これらのデータベースは文字を比較する関数 \IPAref{mtext_casecmp}、
\IPAref{mtext_ncasecmp}、
\IPAref{mtext_case_compare} からの利用を想定している。

\item[文字表示のためのデータベース]~\\
M-text の文字は、その文字が持つテキストプロパティに応じたフォントを使っ
て表示される。（詳細は関数 \IPAref{mdraw_text} 参照。）これを実装する
ために、以下の一連のデータベースを用意した。これらを順に利用することに
よって表示を行なうことができる。

  \begin{itemize} 

   \item \textbf{タグ $<$\texttt{char-table script}$>$ を持ち、各文
         字のスクリプト名を与えるデータベース}

	このデータベースは、各文字がどのスクリプトに属すかの情報を与え
	るものであり、スクラッチより試作した。

   \item \textbf{タグ $<$\texttt{font fontset}$>$ を持ち、
	フォントセット生成用のデータを与えるデータベース}

	このデータベースは、言語やスクリプトからフォントのレジストリ名
	（システムに登録されているフォントの名前）へのマップと、文字セッ
	トからフォントのレジストリ名へのマップという２種類のマッピング
	情報を持つ。

	このデータベースは、デフォルトのフォントセットを作成する際に参
	照することを想定したものであり、スクラッチより試作した。

   \item \textbf{タグ $<$\texttt{font registry}$>$ を持ち、
	各フォントのレジストリ名に対応する文字セットを与えるデータベース}

	このデータベースは文字コードを特定のフォントのグリフコードにど
	う変換するかの情報を与えるものであり、スクラッチより試作した。

	あるフォントを用いて特定の文字を表示するには、文字のコードから
	フォント内のグリフコードへの変換が必要である。あるフォントがど
	のようなグリフコード体系を持つかはそのフォントのレジストリ名で
	決まり、そのグリフコード体系は文字セットのコードポイントと一対
	一の対応がある。そこで、各フォントのレジストリ名に対応する文字
	セットがわかれば、文字コードをグリフコードに変換する方法がわか
	る。

\end{itemize}

\item[文字入力のためのデータベース]~\\
  入力メソッドはユーザの入力キーの列を文字に変換する。このために入力メ
  ソッドは、キー入力列を受け取って、どのような状態に遷移するか、どのよ
  うな文字（あるいは文字列）を出力するかを決定しなければならない。この
  際に必要な情報を与えるデータベースとして以下のものを試作した。各デー
  タベースのタグは $<$\texttt{input-method 言語名 入力メソッド名}$>$ と
  いう形式である。

  これらのデータベースは、入力メソッドをオープンする関数 
  \IPAref{mim_open} および入力イベントのフィルタ処理をする関数
  \IPAref{mim_filter_event} によって利用されることを想定している。

  \begin{itemize}

    \item \textbf{ タグ $<$\texttt{input-method th kesmanee}$>$ を持ち、
      タイ語用の``kesmanee''という名前の入力メソッドに関する情報を与え
      るデータベース}

      この入力メソッドは、タイで広く使われているうちの一つであり、
      Emacs に含まれる同名の入力メソッド用のデータを加工して試作した。

    \item \textbf{タグ $<$\texttt{input-method hi itrans}$>$ を持ち、
      ヒンディー語用の ``itrans'' という名前の入力メソッドに関する情報
      を与えるデータベース}

      この入力メソッドは、デバナガリスクリプトを用いる言語（ヒンディー語
      等）の標準的なトランスリテレーション\footnote{翻字。別の言語の
      文字で書き直すこと。ここではデバナガリ文字の代わりにラテン文字で
      表わすこと。}方法である ITRANS をそのまま
      入力キーとして受け付けるものであり、Emacs に含まれる同名の入力メ
      ソッド用のデータを加工して試作した。

    \item \textbf{タグ $<$\texttt{input-method ja romaji}$>$ を持ち、
      日本語の平仮名用の ``romaji'' という名前の入力メソッドに関する情
      報を与えるデータベース}

      このメソッドは、JIS X 4063 に規定されたローマ字入力方式であり、
      スクラッチから試作した。

  \end{itemize}

  これらのデータベースは、入力メソッドに関する次の情報を与える。
  \begin{itemize}
    \item 入力メソッドを識別するための短いプロンプト文字列。

    \item 入力メソッドの各状態の名前（シンボル）

    \item 各状態毎に受け取った入力キー列に対応して行なうべきアクションの
      列。アクションとは、現在生成している文字列を何文字削除するか、ど
      の文字列を追加するか、そして、どの状態に遷移するかである。
            \end{itemize}

\item[その他の文字ごとの情報のためのデータベース]~\\
UnicodeData.txt にある文字ごとの情報を与えるデータベースとして、以下を
試作した。

  \begin{itemize}
    \item \textbf{タグ $<$\texttt{char-table string name}$>$ を持ち、
      Unicode が定める各文字の名前を C-string で与えるデータベース}

    \item \textbf{タグ $<$\texttt{char-table symbol category} $>$ を持
      ち、Unicode が定める各文字の一般的カテゴリ (General Category) を
      与えるデータベース}

      各カテゴリは\\
      http://www.unicode.org/Public/UNIDATA/UnicodeData.html に示され
      る abbreviation の名前のシンボルで与えられる。

    \item \textbf{タグ $<$\texttt{char-table symbol bidi}$>$ を持ち、
      Unicode が定める各文字の双方向カテゴリ (Bidirectional Category) 
      を与えるデータベース}

      各カテゴリは\\
      http://www.unicode.org/Public/UNIDATA/UnicodeData.html に示され
      る双方向カテゴリの名前のシンボルで与えられる。

  \end{itemize}

これらのデータベースは、文字プロパティの値を得る関数
\IPAref{mchar_get_prop} によって利用されることを想定している。

\end{description}

\item  「m17n言語情報ベース」を操作するための API

「m17n言語情報ベース」に含まれるデータベースを操作するために、以下の
APIを設計した。

  \begin{itemize}

  \item 「m17n言語情報ベース」中から必要なデータベースを検索する機能

    関数 \IPAref{mdatabase_find} を設計した。

  \item データベースをロードする機能

    関数 \IPAref{mdatabase_load} を設計した。

  \item データベースについての情報を取得する機能

    関数 \IPAref{mdatabase_tag} を設計した。

  \item 「m17n言語情報ベース」に新しいデータベースを追加する機能

    関数 \IPAref{mdatabase_define} を設計した。

  \end{itemize}

\end{enumerate}
