この広告は、90日以上更新していないブログに表示しています。
glibc の wcwidth() の「曖昧な文字幅」についての動作の話の続き。
やっぱり、UTF-8 の charmap を全部書き換えてしまうのは良くないと思い、以下のようにしてみた。
まず、/usr/share/i18n/charmaps/UTF-8.gz を改造してambiguous width な文字の幅を 2 にしたものを /usr/share/i18n/charmaps/UTF8-8-CJK.gz として設置。*1
次にUTF-8-CJK を使って locale を再作成
$ sudo localedef -i ja_JP -c -f UTF-8-CJK ja_JP.UTF-8
あるいは、/etc/locale.gen を以下のように書き換えて locale-gen コマンドを実行しても同じ。(Debian 特有?)
en_US.UTF-8 UTF-8ja_JP.EUC-JP EUC-JPja_JP.UTF-8 UTF-8-CJK
この状態で、前回作成したプログラムを実行した結果は以下のとおり。
$ LC_CTYPE=ja_JP.utf8 ./a.outwcwidth('A') == 1wcwidth('α') == 2wcwidth('あ') == 2 $ LC_CTYPE=en_US.utf8 ./a.outwcwidth('A') == 1wcwidth('α') == 1wcwidth('あ') == 2これなら、CJK な人も non-CJK な人もそれなりに幸せになれるのではなかろうか。
もっとも、何かの拍子に(locales パッケージをアップグレードした時とか) locale-archive が更新されて元に戻ってしまいそうだけど、その時はその時で。
なお、UTF-8-CJK な charmap を作るにあたっては、以下のバグ報告(glibc 本家とDebian のglibc パッケージ)を参考にした。
*1:文字幅の情報はEastAsianWidth.txt (unicode.org) を参照。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。