2008-07-29

Unicodeでの幅がはっきりしてない文字の問題

Linux 話なんだけど、UTF-8 な mlterm 上の GNU Screen の上で、mutt や w3m を使うとたまに表示が乱れるという問題があった。具体的には―や■などがあるとおかしくなる。

調べてみると Unicode での東アジアの曖昧な文字幅の文字 (CJK / East Asian ambiguous width character) という割に有名な問題だったらしい。よく調べてないけど、Unicodeのいくつかの文字について、文字幅を半角か全角とするかでソフト間で齟齬が生じたために表示が乱れていたらしい。ちゃんとUnicodeの仕様が統一されてないのかな?

ひとまず mlterm の .mlterm/main で col_size_of_width_a = 1 としとくと、mlterm と GNU Screen との齟齬が生じないので一応問題を回避できるが、それだとそうした文字列を半角としてしまうことになる。しばらくそれで放っておいたが、それじゃあんまりなので、ついカっとなって解決することにした。なんかコンパイルするの久しぶりかも。

具体的には以下の手順で解決できる。mutt は何もしなくても上手く動いたっぽい(パッチがあったっぽいけど)。

  1. GNU Screen と w3m にパッチあててビルド
  2. mlterm, screen, vim, w3m は設定変更

まず GNU Screen には ftp://www.dekaino.net/pub/screen/ にある以下のパッチをあて、あとは普通に ./configure && make && sudo make install.

  • screen-4.0.2-deadlock-patch
  • screen-4.0.2-hankanacopy-patch
  • screen-4.0.2-patch-cjkwidth-cvs-2006052001

次に w3m に以下のパッチをあて ./configure --with-termcap=ncurses && make && sudo make install.

最後に設定を変更する。

  1. .mlterm/main にて col_size_of_width_a = 2
  2. .screenrc にて cjkwidth on
  3. .vimrc にて set ambiwidth=double
  4. w3m はオプション画面にて ”Use double width for some Unicode characters" を有効にする。

これですっきり。それにしても未だにUnicodeでの問題があるってのは冴えないなあ。

参照サイト