2011年7月18日月曜日

xterm UTF-8文字幅

最近の xterm は UTF-8 に対応していて、-mk_width-cjk_width オプションで文字幅を切り換えることができます。実は xterm は特にオプションで指定しなかった場合には libc ロケールの文字幅を使用します。前回に GNU libc のロケール文字幅を変更する方法を紹介しました。

ということは、これで xterm での文字幅もバッチリということですね。
LANG環境変数に合わせてCJK文字幅や日本語互換文字幅も使えるはず。
・・・あれ?
・・・・使えるはず?!?
・・・・・何で?何で?
・・・・・・なぜか駄目でした。うーむ。

で source を確認したところ「罫線(line drawing)が全角の場合、そのロケールは信頼できないので、ロケールの文字幅は使用しない」という処理が入っていました。何ってこった。(Solaris のロケールが常に 2を返すので無効にするためらしいです。)

日本語処理系では伝統的に罫線は全角なんだよー。わかれよー。変なことすんなよー。

ということで余計な処理を無効にするために #ifdef でコメントアウトしてしまいました。以下のパッチを当てることで、フォント設定さえ適切なら xterm で ロケールの文字幅が使えるようになります。

--- xterm-269.orig/util.c 2011-02-17 09:28:45.000000000 +0900
+++ xterm-269/util.c 2011-06-17 10:59:16.922977037 +0900
@@ -3881,6 +3881,7 @@
     wchar_t n;
     int oops = 0;
 
+#ifdef __sun
     for (n = 21; n <= 25; ++n) {
  int code = (int) dec2ucs((unsigned) n);
  int system_code = wcwidth(code);
@@ -3899,6 +3900,7 @@
      break;
  }
     }
+#endif
 
     for (n = 0; n < (wchar_t) samplesize; ++n) {
  int system_code = wcwidth(n);

0 件のコメント:

コメントを投稿