mule-ja
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mule-ja:71] translation table given to coding system


From: Ikumi Keita
Subject: [mule-ja:71] translation table given to coding system
Date: Sun, 22 May 2016 23:52:53 +0900

  井汲です。だいぶ以前の話ですが、[mule-ja:19] で書いた以下の件について
調べてみた所、概ね事情がわかって修正案も作れたので、まとめておきます。

> ※ 「ぼぎ〜てっく」blog の件ですが、だいぶ下の方に

>> これに対応するために Emacs の日本語環境には jisx0213-to-unicode,
>> unicode-to-jisx0213 という変換テーブルがデフォルトで定義されいます。こ
>> れを使えばうまくいくはず....

>> だったのですが....... この変換表 translate-region などでは、きちんと使
>> 用できるのですが、なぜか文字コードの translation-table に設定しても正
>> 常に動かないという問題があります。バグか仕様の変更に対応できていないか
>> 何かだと思われます。

> という指摘も見られます
>http://bogytech.blogspot.jp/2011/06/emacs-23-5.html )。

  以下の話はすべて emacs 24.5 で試したもので、開発版では違いがあるかもし
れません。

[0] 前提
  「正常に動かない」という指摘の詳細を確認するため、添付その1の tar+gz
を開梱して得られる2ファイル jisx0213, utf8 を使用。これらはそれぞれ、変
換テーブル jisx0213-to-unicode に収められている「JISX0213 には含まれてい
るが unicode には含まれていない文字」及び「それらを unicode の合成文字を
使って表したもの」から作ったデータ。(「jisx0213」は文字集合の名前、
「utf8」は文字コードの名前なので対比のさせ方が変ですが、それに気づいたの
がたった今なのでこのまま話を進めます)

[1] 無変換時の動作確認
  これらのファイルを emacs 24.5 で普通に開いてみると、期待通りの結果にな
る。すなわち、
o jisx0213 の方は半濁点付きかなやアクセント付き欧文文字等が emacs にとっ
  ての「1文字」として扱われ、対応するフォントで表示される。
o utf8 の方は、半濁点付きかなは「unicode の合成用半濁点」がかなと分離し
  た独立した1文字として扱われる。アクセント付き欧文文字は、
  auto-composition-mode が有効なおかげで見た目やカーソルの移動に対する応
  答としては1文字として扱われているように見えるが jisx0213 の方とはフォ
  ントが違っており、C-u C-x = の結果も「バッファ内の文字としては2文字だ
  が表示上は合成されて1文字であるかのように見えている」ことがわかるよう
  になっている。アクセント付き欧文文字の後に続く最後の記号部分は、再び分
  離して2文字として扱われている。

[2] jisx0213-to-unicode, unicode-to-jisx0213 の動作確認
  [1] で読み込んだバッファで、region を設定して M-x translate-region を
実行する。ミニバッファで変換テーブルを問い合わせてくるので、バッファ
jisx0213 の方では jisx0213-to-unicode を指定し、バッファ utf8 の方では
unicode-to-jisx0213 を指定。結果は期待通り正常に動作。つまり、jisx0213
の方は1文字だった文字が対応する unicode の合成文字表現に置き換わり、
utf8 バッファと同じ見た目になる。また、utf8 バッファの方も jisx0213 の1
文字に置き換わり、先ほどまでの jisx0213 バッファと同じ見た目になる。

[3] coding system の decode 用変換 table としての動作確認
  ここからが本番。これまで実験に使った jisx0213, utf8 のバッファを一旦
kill する。
  続いて
  (coding-system-put 'euc-jis-2004 :decode-translation-table
'jisx0213-to-unicode)
  (coding-system-put 'utf-8 :decode-translation-table
'unicode-to-jisx0213)
を *scratch* 等で評価し、再度 jisx0213, utf8 のファイルを開く。期待され
る動作は、[2] で translate-region を実行した後と同じように表示されること
である。
  実際には、uff8 の方は期待通りの結果になったが、jisx0213 の方は [1] で
普通に開いた状態と同じになった。
  以上から、coding system の decode-translation-table に指定した場合、
unicode-to-jisx0213 は正常に機能するが jisx0213-to-unicode は機能してい
ないことがわかった。

[4] coding system の encode 用変換 table としての動作確認
  続いてバッファ jisx0213 に [2] と同様に translate-region を実行し、
unicode の合成文字表現状態にしておく。更に
  (coding-system-put 'euc-jis-2004 :encode-translation-table
'unicode-to-jisx0213)
  (coding-system-put 'utf-8 :encode-translation-table
'jisx0213-to-unicode)
  (setq select-safe-coding-system-function nil)
を評価した上で、それぞれのバッファで C-x C-w で適当なファイル名で保存する
(実験ではファイル名に jisx0213-2, utf8-2 を用いた)。期待される動作は、
元々のファイル jisx0213, utf8 と同一の内容のファイルが作られることである。
  実際には、jisx0213-2 は jisx0213 と同内容のファイルになった(cmp コマ
ンドで確認)が、utf8-2 の方は1行目の「-*- coding: utf-8; -*-」のみから
なるファイルになった。
  以上から、coding system の encode-translation-table に指定した場合も、
[3] と同じく unicode-to-jisx0213 は正常に機能するが jisx0213-to-unicode
は機能していないことがわかった。

[5] 調査
  japanese.el を見ると、変換テーブル jisx0213-to-unicode,
unicode-to-jisx0213 は make-translation-table-from-alist で作られている。
mule.el でその関数定義を見てみると、この関数が char table に格納する値
((aref table index) で返ってくる値)は次の3通りのどれかになるらしい。
<1> integer TO-CHAR
<2> vector  [TO-CHAR ...]
<3> alist   (([FROM-CHAR ...] . TO) ...)  TO は TO-CHAR か [TO-CHAR ...]
再度 japanese.el を見ると、jisx0213-to-unicode はすべて <2> のタイプ、
unicode-to-jisx0213 はすべて <3> のタイプとして作られるはず。そこで、次
の仮説を立てた。
【仮説】coding system の {de,en}code-translation-table の処理では、<2>
       のタイプのエントリが正しく扱われていない
  そこで coding.c を覗いて decode・encode 処理で translation table を扱っ
ていると思しき部分を眺めてみると、案の定 INTEGERP や CONSP で条件分岐し
ている付近で、値が vector になるケースを考慮していないらしいことを発見。

[6] 検証
  C 言語は学んだことがないが、見よう見まねで添付その2のように修正してみ
た所、コンパイルし直した emacs では [3], [4] は期待通りの動作となった。
仮説は正しかったようだ。

[7] おまけ
  editfns.c で translate-region-internal の処理を眺めてみると、こちらは
<2> のタイプのエントリもちゃんと配慮しているように見える。なので
translate-region では jisx0213-to-unicode も期待通りに機能していたのだろ
う。

  [6] の修正をそのまま使うかどうかはともかく、何らかの修正は施した方がい
いように思います。

  以上です。

                                                井汲 景太

Attachment: test-translation.tar.gz
Description: test suite

Attachment: sample-patch
Description: vector value of translation table


reply via email to

[Prev in Thread] Current Thread [Next in Thread]