Debian lenny の screen の cjkwidth パッチが壊れてる件

あるいは「Unicode の曖昧な文字幅(ambiguous width)問題 その3」。*1
Debian lenny の screen にはGNU screen bug #16666の cjkwidth パッチがあてられていて*2UTF-8 環境で aptitude とか w3m とかのレイアウトが崩れなくなるぜ……と思ったら全然ダメだった。
「なぜ?」と思って BTS への投稿(Bug#478884)とパッチの中身(40cjk_eastasian.dpatch)をよく見てみたら、、、これ、壊れてるね。ほとんど意味がない。

  1. cjkwidth コマンドを定義しているけど、無意味。
  2. 肝になる utf8_isdouble() 関数は glibcwcswidth() を呼んでいるだけ。
    • GNU screen bug #16666 に添付されていた本来のパッチでは、グローバル変数 cjkwidth の値を見て、独自実装のテーブルを使って文字幅を判定していた。
    • 本筋とは関係ないけど、なぜ wcwidth() を使わなかったんだろう?
  3. glibcwcwidth() は、現時点では「East Asian Ambiguous Character Width」に対応していない。
    • 文字幅の定義は /usr/share/i18n/charmaps/UTF-8.gz に記述されているが、この定義は言語によらず固定、つまり en_US でも ja_JP でも同じ定義が使われる。

ということで、このパッチは何も解決してない。
Debian lenny において screen を使って「レイアウトが崩れる!」と気になる方は、etch までと同様に独自ビルド等で何とかすべし。(中途半端にパッチがあたっている分、以前より状況が複雑になってるけど)
なお、GNU Screen の本家 BTS の cjkwidth パッチは取り込まれたようなので、GNU Screen の将来のリリース(4.1.0)では問題なくなるはず。
DebianBTS に投稿しようかと思ったけど、glibc の wcwidth() で何が困るのかをうまく説明できる自信(と英語力)が無いので保留。

*1:関連: id:macks:20061001 「Unicode の曖昧な文字幅問題 その2」

*2:http://bugs.debian.org/478884