Pushkin concordance, UTF-8 - Ctext 変換

プーシキン・電子コンコーダンス・サービスのコーパスを見直し中である。このシステムでは従来,ロシアで売りに出たプーシキン全集 CD-ROM から抽出した電子テキストを使った。でも詩,小説,物語詩,詩劇などの藝術テクストにコーパスを限定していた。このたび批評,書翰も追加した。これからさらに改善していくつもりでいる。プーシキンの論文を書いたとき,やはり Полное собрание сочинений(完全全集)でないとちょっと不十分だと自分でも認識があった。3.11 のショックで «Медный Всадник»(『青銅の騎士』)を読み直し,ちょっと自分なりの発見をして以来,プーシキンのことばを精密に洗い出すために,このプログラムも改善したいと思うようになった。ロシア文学研究者にも使って欲しいものであるが,残念ながら誰も使わない(その理由は私がいちばんよく知っている。コーパスの完全性とワード出現部位の原典参照機能。そこを改修したい)。

このシステムのコーパスは Ctext - X Window System Compound Text というエンコーディングでないと処理できない。本当は UTF-8 にしたいのだけれど,このプログラムを作った 1998 年当時はエディタなどの環境上の問題で,多言語テキスト用途で Unicode を使うのに踏み切れず,UNIX の世界の多言語テキスト形式である Ctext に準拠した。私は 1993 年から Mule(Emacs 多言語機能の礎になった,日本人の開発した驚くべき多言語エディタ)上で日本語・ロシア語混在の Ctext テキストを作成するようになった。Ctext とは,ISO 2022 国際標準に準拠した,いわゆるエスケープ・シーケンスで既存の言語文字コードを切り換えることによって多言語テキストを実現する符号化方式である。Unicode の CJK 統合漢字の包摂問題がないというメリットがあるが,エスケープ・シーケンスという古色蒼然とした方式であり,部分だけで文字の判断ができないという欠点がある。テキスト・ストリームの先頭部が失われると残りの部分のデコードも困難になる。

時代は変わりいまや UTF-8 でテキストを準備し,Ctext に変換しなければならない。コード変換ソフトウェアは数あるけれども,Ctext をメニューにもつものは,寡聞にして coco(Mule の付属ユーティリティ)くらいしか思い浮かばない。ところが coco は Unicode が扱えない。じゃ,どうするか。Ctext も UTF-8 もサポートする GNU Emacs を,バッチ起動で使うのである。

% emacs -l lisp1 ファイル -l lisp2 -f save-buffer -kill

と,コマンドラインで投入すると,Emacs は lisp1 を読んで評価してから「ファイル」をオープンし,lisp2 に従って処理をしたバッファを「ファイル」にセーブして終了する。この仕様を利用して,lisp1 に UTF-8 としてファイルを開く Emacs-lisp を書いておき,lisp2 にバッファ・コーディング・システムを Ctext に変更するコードをしるしておけば,人間のオペレーションを介さずに,UTF-8 - Ctext エンコーディング変換を自動実行することができる。この lisp1, lisp2 の Emacs-lisp コードはそれぞれ以下のようなものである。

;; utf-8 input script
(set-default-coding-systems 'utf-8-unix)
; chaset priority
(set-charset-priority
 'cyrillic-iso8859-5
 'greek-iso8859-7
 'hebrew-iso8859-8
 'latin-iso8859-1
 'latin-iso8859-2
 'japanese-jisx0208
 'japanese-jisx0212
 'japanese-jisx0213-1
 'japanese-jisx0213-2
 'japanese-jisx0213.2004-1
 'chinese-big5-1
 'chinese-big5-2
 'chinese-gb2312
 'korean-ksc5601
)
; open file encoding
(setq coding-category-raw-text 'utf-8-unix)
;; ctext output script
(set-buffer-file-coding-system 'x-ctext-unix)

入力用に set-charset-priority を指定しているのは,ロシア語 ISO 8859-5 などの優先度を日本語 JIS コードよりも上げておかないと,へんなエスケープ・シーケンスが付いてしまうからである。カレント・ディレクトリにある UTF-8 テキストファイルすべてを Ctext に変換するシェルスクリプトは以下のようになる。-q オプションを付けて Emacs を起動しているので,.emacs の設定如何によらずうまく動くはずである。

#!/bin/sh
for i in *.txt
do
    echo "convert encoding $i from UTF-8 to Ctext."
    emacs -q -batch -l iutf8.el $i -l octext.el -f save-buffer -kill
    mv $i~ $i.back
    echo "backup file saved to $i.back."
done

こんなのは誰も使わない。もはや Ctext はほとんど過去の遺物だから... (とはいえ,Emacs の C-c h で表示される万国こんにちはメッセージ,Emacs で動くメールソフト Mew の Summary では Ctext が健在である)。

それにしても,execute(処刑する) だとか kill (殺す)だとか,コンピュータ用語には不穏なものが多いですね。この場合「実行する」,「停止させる」なんだけど。