Emacs 22.0.50 の Ctext

二月に書いたプーシキンの『オネーギン』論の統計分析の見直しを行っている。単語における色彩的要素を抽出して自論の検証に用いたのだが,数値が何故有意なのかという統計的検証がまともにできているとはいえないことは自覚していた。これを統計的検定によって論証しておこうと考えている。

このため単語統計の分析ツールをせっせと作成しているところである。基本は,大昔に作成した staslova という多言語単語統計プログラムを利用し,その出力から単語の出現頻度や分散などの統計量を算出するツールを追加しようとしている。staslova は,X Window System Compound Text (Ctext) 形式で準備した分析対象テキストに対し,単語出現回数や指定条件にマッチするテキストを抽出し,キリル言語,ラテン文字言語,日本語毎に結果を表示するものである。

Ctext とは,言語毎に決められたエスケープシーケンスで多言語テキストを表現する X11 の古典的多言語テキストフォーマットである。近年 Unicode が標準となりつつある状況では,ほとんど忘れ去られた形式であるが,繁体中国語,簡体中国語,韓国語,日本語を,ISO-2022 準拠の個別エスケープシーケンスで包んで管理するので,Unicode CJK 統合漢字のような包摂問題がない,というメリットがある。

ところが,今回 UTF-8 で準備したプーシキンテキストを Mac OS X 上の Emacs 22.0.50 で Ctext 変換し,staslova にかけたところ,Ctext に想定外のエスケープシーケンスが現われ,ぼろぼろエラーが発生する。テキストの十六進ダンプを確認すると,キリル文字のエスケープシーケンスが X"1b242d31" となっていて確かにおかしい。Ctext の仕様では,キリル ISO-8859-5 文字セットに対するエスケープシーケンスは X"1b2d4c" のはずである。FreeBSD Emacs 21 + Mule-UCS ではこんなことにはならない。Emacs 22 Unicode サポートで新しいエスケープシーケンス仕様が追加されたようである。おまけにキリル文字は2バイトエンコードされて,上位バイトに X"A8" が付加されるようである。これでは staslova が使えない。

しようがないので,キリル用エスケープシーケンスを訂正し,同時に X"A8" を除去するプログラムを一本書いて対策した。その際,Ctext の文字集合呼出しの仕様を確認する必要が出来し,十年ほど前に首っ引きで読んだ解説書『マルチリンガル環境の実現 — X Window/Wnn/Mule/WWW ブラウザでの多国語環境』を,久しぶりに引っ張り出すことになった。これは,Mule を開発したかつての電総研の半田剣一氏など,錚々たるメンバーが書いた名著といってよい。日本の研究者が当時この分野で世界をリードしていたことが解る。はじめて計算機を購入し,日本語と同時にロシア語を読み書きすることにやっきになっていた私は,この本に出会って以来,UNIX 利用一辺倒になってしまったのである。本書で述べられた多言語実現方式が,現在標準となっている Unicode には活かされていないようで,ちょっと寂しい。この本もいまや絶版となり,入手は困難のようである。

ところで,Emacs 22 のキリル文字に付加されていたエスケープシーケンスはいったい何なのだろうか。これが Unicode に関連した Ctext の新仕様だとすれば,どこでそれを確認すればよいのであろうか。

マルチリンガル環境の実現―X Window/Wnn/Mule/WWWブラウザでの多国語環境

錦見美貴子,戸村哲,桑理聖二,吉田智子,高橋直人,半田剣一,向川信一
プレンティスホール出版
 

※ 2009/9/4 付記
この問題は Ctext 符号化の際の charset-priority に原因があることが判った。.emacs に (set-charset-priority 'cyrillic-iso8859-5) と書いておくと,cyrillic-iso8859-5 が優先され,エスケープシーケンス X"1b2d4c" でキリル文字を符号化できる。