Mule-UCS は, Meadow と同じ宮下尚さんの作品です。 これを使うと, UCS のファイルを Mule で読み書きできるようになります。
Meadow で Mule-UCS を使うには, 以下の方法があります。
Meadow は ftp://ftp.etl.go.jp/pub/mule/Windows/ にあります。 Mule-UCS および Meadow 1.00 から 1.01 への差分は ftp://ftp.etl.go.jp/pub/mule/Mule-UCS/ にあります。
変換表が巨大なので, byte-compile しないと実用的には使えません。 Mule-UCS 0.52 以降には mucs-comp.el が用意されているので, コマンドラインから
cd \Mule-UCS-0.52 meadow -batch -l mucs-comp.el
とすればコンパイルできます。
なお, Mule-UCS はファイルを読み書きするときに UCS を Mule の多言語コードに変換しているだけで, 直接 Mule 自身を UCS プログラムにするわけではありません。 したがって, 例えば JIS X 0208 になくて GB2312 にある文字を表示するには GB2312 のフォント (TTF または BDF) が必要になります。
とりあえず Meadow 1.05b1 + Mule-UCS 0.52 を試してみました。
( 追記: Meadow 1.10 + Mule-UCS 0.62 では以下に記す問題はほぼ解消しており, 正式版であるということで 1.10 を使った方がいいのはわかっているのですが, 個人的にまだ 1.00 から 1.10 への変更点を把握しきれていないので, とりあえずこのままにしておきます。 )
まずちょっと問題なのは, Mule-UCS の追加する coding-system がふつうの coding-system と少し異なっていることです。 このため, 改行コードの判別に失敗するなどの不具合が出ているようです。 本来は Mule-UCS の側を直すべきなのでしょうが, たとえば UTF-8 の場合, 下のようなコードを追加することによって問題は出なくなりました。
(put 'utf-8 'eol-type [utf-8-unix utf-8-dos utf-8-mac]) (put 'utf-8-unix 'eol-type 0) (put 'utf-8-dos 'eol-type 1) (put 'utf-8-mac 'eol-type 2) (coding-system-put 'utf-8 'alias-coding-systems '(utf-8)) (coding-system-put 'utf-8-dos 'alias-coding-systems '(utf-8)) (coding-system-put 'utf-8-mac 'alias-coding-systems '(utf-8)) (coding-system-put 'utf-8-unix 'alias-coding-systems '(utf-8))
最初の 4行で eol-type プロパティを変えているのは, 改行コードを Mule に自動判別させるためです。
次の 4行で coding-system 部分の alias-coding-systems プロパティを変えているのは, それほど重要ではありませんが, これがないと例えば M-x list-coding-systems を実行した場合に utf-8 utf-8-dos utf-8-unix utf-8-mac が別々に表示されてしまいます。 coding-system 部分は改行コードによって違いはないはずですから, 上のように直さなければならないはずです。
つぎに, Mule-UCS では un-tools パッケージによってファイルの coding-system を自動判別しているのですが, UTF-8 の場合は通常 un-tools では自動判別できません。
( 追記: Meadow 1.10 + Mule-UCS 0.62 では UTF-8 も自動判別できます。 また, un-tools は使いません。 しかし, 以下のヘッダによる判別自身は Meadow 1.10 でも意味があるでしょう。 )
HTML や XML ではたいていヘッダによって識別できるので, ヘッダで判別する関数を作ってみました。 いささか長めですが, やっていることは大したことではありません。
(defvar html-xml-charset-decl-alist
'(("\\.html?$" nil
"<meta\\b[^>]+content-type[^>]+charset *= *\\([a-zA-Z0-9_.-]+\\)")
("\\.xml$" utf-8
"<\\?xml\\b[^>]+encoding=['\"]\\([a-zA-Z0-9_.-]+\\)")))
(defvar html-xml-auto-coding-chain)
(defun html-xml-auto-coding (filename size)
(or (funcall html-xml-auto-coding-chain filename size)
(let ((case-fold-search t) (alist html-xml-charset-decl-alist)
search-limit pat cs string)
(while (and alist (not pat))
(if (string-match (car (car alist)) filename)
(setq pat (cdr (car alist))))
(setq alist (cdr alist)))
(when pat
(goto-char (point-min))
(setq search-limit (+ (min size 4096) (point)))
(if (not (search-forward-regexp (cadr pat) search-limit t))
(car pat)
(setq string (downcase (match-string 1)))
(while (string-match "^x-" string)
(setq string (substring string 2)))
(setq cs (intern string))
(if (coding-system-p cs) cs))))))
(setq html-xml-auto-coding-chain set-auto-coding-function
set-auto-coding-function 'html-xml-auto-coding)
正規表現はかなりいい加減ですが, まあたいてい大丈夫ではないかと... XML の方はちゃんとテストしていません。
ただし, これだと Mule で定義されていない us-ascii や gb2312 の判別が出来ないので, 例えば下のように alias を追加してやります。
(define-coding-system-alias 'gb2312 'chinese-iso-8bit)
その他, UCS とはとくに関係ないのですが, Meadow 1.05b1 では set-language-environment でなぜか現在のバッファのキーボード入力用 coding-system が変わらない (1.00 では変わっていた) ようです。 これでは漢字が入力できないので, 下のような処理を追加してみました。 set-language-environment-hook は Meadow 1.00 にはありません。 新しく追加されたフックのようです。
(add-hook 'set-language-environment-hook
'(lambda ()
(set-keyboard-coding-system default-keyboard-coding-system)))