Mew 6.2.52 on Emacs-23 を使いはじめて,ロシア語メールの Subject が全角キリル文字(さざなみ日本語フォントにあるキリル文字)で表示されることに気づいた。メール本文は問題ない。外国語はそれ用のフォントでないと醜いし,幅広だと情報量も落ちてしまう。Mew-dist や Mule-ja メーリングリストに問い合わせたところ,次のようなことが判明した。
Mew の Summary(メール一覧表示)では,多言語対応のため,CTEXT(X11 Compound Text)コーディングシステムを採用している。一方,Emacs はバッファを CTEXT で符号化する際に,エスケープシーケンスに包む個別の文字コードを優先順位を付けて選択する。日本語環境では,標準は japanese-jisx0208 が優先される。このため,バッファのキリル文字は,国際標準 ISO 8859-5 キリルではなく,JIS で定義されたキリル文字コードにエンコードされる。この結果,Summary の表示は JIS コード用の日本語フォントが使われた。
つまり対策は,その文字コードの優先順位を,ISO 8859-5 が japanese-jisx0208 よりも高くなるように指示してやればよいということになる。そのための関数 set-charset-priority がある,とメーリングリストで教えていただいた。Emacs の info で set-charset-priority 関数仕様を調べて,優先度設定コードを .emacs に追加したら,DejaVu フォント・半角のキリル文字で Summary 表示できるようになった。ギリシア語も同じ構造に嵌るので,greek-iso8859-7 も追加しておいた。また,キリル文字は width が 2 のため Subject エリアの空白数が文字数分不足することで,Summary のレイアウトがいびつになってしまう。width を 1 に設定し,キリル文字数と width を合わせるコードも入れた。これらの .emacs 対策コードは以下のとおり。
;; iso-8859-5 優先 (set-charset-priority 'cyrillic-iso8859-5 'greek-iso8859-7 'mule-unicode-0100-24ff 'japanese-jisx0208 ) ;; キリル・ギリシア文字の width を 1 に ;; (Mew Summary レイアウト不正対策。Unicode-cyrillic は不要) ;;; iso-8859-5 キリル文字 (map-charset-chars (lambda (range ignore) (set-char-table-range char-width-table range 1)) 'cyrillic-iso8859-5) ;;; iso-8859-7 ギリシア文字 (map-charset-chars (lambda (range ignore) (set-char-table-range char-width-table range 1)) 'greek-iso8859-7)
前に書いた記事『Emacs 22.0.50 の Ctext』で CTEXT のエスケープシーケンスが変わってしまったことに触れた。この要因について今回わかったという収穫もある。上記の設定により,エスケープシーケンス X"1b2d4c" + ISO 8859-5 文字コードでキリル文字を CTEXT 符号化することができるようになった。
※ 2009/09/05
漢字フォントキリル文字が Unicode フォントに変更されたスナップショットを以下に示す。