FreeBSDでurxvt使ってるけど、全角の記号(□■○●◇◆など)が半角の文字幅で表示されてキモかった。
いわゆる East Asian Ambiguous Character Width とか略して EAW とか言われる問題で、噂によるとurxvt的にはlocaleが示す幅を尊重するからurxvt側でそれを勝手に2バイト幅に直して表示とかはしないぜ!って事になってるらしい。
まあ経緯とか細かい実装の話はさておき、localeの側が全角記号を2バイト幅ですよって言うようにしてやればよろしいみたい。
FreeBSDのロケールの設定は、/usr/share/locale/
の下に保存されてて、ここの ./ロケール名/LC_CTYPE
が今回直したい部分。
こいつはバイナリファイルで、 /usr/src/share/mklocale/
の下にある .src ファイルを mklocale コマンドでコンパイルした物がそれにあたるっぽい。
/usr/share/locale/ja_JP.UTF-8/LC_CTYPE
は /usr/share/locale/UTF-8/LC_CTYPE
にシンボリックリンクを貼ってるので、今回はそうするのをやめて ja_JP.UTF-8 専用に LC_CTYPE を作るように直してみる。
まずは src ファイルを書かないといけないんだけど、書くのがめんどくさい。探してみたらmutt-jaのリポジトリに良さげなのが置いてあったのでそいつを使う。
$ wget http://sourceforge.jp/projects/mutt-j/scm/svn/blobs/146/mutt-ja-doc/trunk/samples/UTF-9.src?export=raw -O ja_JP.UTF-8.src
こいつを /usr/src/share/mklocale/
にコピーする。
$ sudo cp ja_JP.UTF-8.src /usr/src/share/mklocale/
んであとは /usr/src/share/mklocale/Makefile
を編集。
--- share/mklocale/Makefile (リビジョン 275347)
+++ share/mklocale/Makefile (作業コピー)
@@ -8,6 +8,7 @@
hi_IN.ISCII-DEV \
hy_AM.ARMSCII-8 \
ja_JP.SJIS \
+ ja_JP.UTF-8 \
ja_JP.eucJP \
kk_KZ.PT154 \
ko_KR.CP949 \
@@ -82,7 +83,7 @@
en_AU en_CA en_GB en_IE en_NZ en_US es_ES et_EE eu_ES fi_FI \
fr_BE \
fr_CA fr_CH fr_FR he_IL hr_HR hu_HU hy_AM is_IS it_CH it_IT \
- ja_JP kk_KZ ko_KR lt_LT lv_LV mn_MN \
+ kk_KZ ko_KR lt_LT lv_LV mn_MN \
nb_NO nl_BE nl_NL nn_NO no_NO pl_PL pt_BR pt_PT \
ro_RO ru_RU sk_SK sl_SI sr_YU sv_SE tr_TR uk_UA zh_CN zh_HK \
zh_TW
あとはビルドするだけ。
$ cd /usr/src/share/mklocale/
$ sudo make
$ sudo make install
うまくいくと、/usr/src/share/mklocale/LC_CTYPE
がシンボリックリンクじゃなくなって実ファイルになってる。
で、あとは X の再起動とかすれば2バイト幅で綺麗に表示されるようになってるはず。やったね!