Mule-UCS メモ

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)))

コンピュータ関係に戻る