2009年3月18日水曜日

UTF-8環境と曖昧な文字幅

UbuntuはデフォルトでUTF-8環境なのだけど、ターミナルエミュレータ上でw3mやEmacsを使っていると表示が乱れることがときどきある。Unicodeが持つ「東アジアの曖昧な文字幅(East Asian Ambiguous Character Width)」というのが原因で起きる問題らしい。

「東アジアの曖昧な文字幅」問題とは文脈によって文字幅が変化する文字があって、そういう文字をアプリケーション側で全角(fullwidth)として扱えばいいらしいのだけど、半角(halfwidth)として扱うと表示されるフォント幅と食い違って、結果として表示が乱れるということのようだ。

いろいろなWebページを参考にして設定をしてみたのだけど、ほとんどまったく解決しなかった。あまり深追いもしたくないので、とりあえずやれるだけやったことを各アプリケーションごとにメモしておく。

mlterm

mltermは設定ファイルに1行追加することで回避できる。

% echo "col_size_of_width_a = 2" >> ~/.mlterm/main

または、起動時にオプションを指定することでも可能。

% mlterm -a 2

これで全角で表示されるはずの文字(■など)が半角で表示されることはなくなったのだけど、その前の文字をバックスペースで消したりすると表示が乱れる。

Screen

~/.screenrc

defencoding utf-8
encoding utf-8 utf-8
cjkwidth on

を追加して、起動時に-Uオプションを渡す。

% screen -U

defutf8 onutf8 on-Uオプションで起動すれば必要ない。cjkwidth onが曖昧な文字幅問題を解決するための設定で、Ubuntuのパッケージはパッチが取り込まれていて使用可能になっているのだけど、mlterm単体でもおかしいので効果があるのかはよくわからない。

Emacs 22

~/.emacsに下記を追加する。

(set-language-environment "Japanese")
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(setq file-name-coding-system 'utf-8)

Emacs 22ではutf-translate-cjk-modeというマイナーモードが追加され、デフォルトで有効になっているためmule-ucsは必要ない。曖昧な文字幅問題はEmacs22 + UTF-8 における文脈依存な文字幅の問題についてに書いてある設定で解決する。試してみたところGUIで起動した場合は確かにまったく問題ない。でも、-nwオプションをつけてmlterm上で起動した場合は当然だけどだめだった。

w3m

一番問題になるのがw3m。ページによっては表示の乱れが激しすぎて使い物にならない。w3m-cvs-1.914-ambwidth.patchを当てて、ある種のUnicode文字を全角にするYesにすればいいらしいのだけど、パッケージを作り直すのが面倒そうなのであっさりあきらめる。HP 2133購入後はFirefoxをメインに使うようになったので、別にw3mはなくても問題ないし。

参考