East Asian Ambiguous 文字とは、Unicodeで文字幅が曖昧(文脈により異なる文字幅で表示する)と定義されている文字のことで、例えば、○(U+25CB)や×(U+00D7)や△(U+25B3)などの文字です。
East Asian Ambiguous 文字の一覧はこちら。
East Asian Ambiguous Width 問題とは、これらの文字をコンソールで表示する際に、libcのwcwidth(3)
、ターミナルエミュレータ、テキストエディタなどがそれぞれ異なる文字幅(半角、全角)と認識するため、表示が壊れてしまう問題です。
テキストエディタの場合カーソルの内部状態と表示位置がズレたりします。
この問題のてっとり早い解決方法のひとつは曖昧な文字の文字幅を全角で統一する事です。
対応方法はアプリケーションによって様々ですが、xterm, mlterm, vimなどを使っている人は設定やオプションを指定するだけで文字幅を変更することができます。
しかし、rxvt-unicodeやemacsを使っている人は残念でした、これらのアプリケーションは曖昧な文字幅を統一するオプションが用意されていません。
このレポジトリでは文字幅を修正したlibcのロケールとrxvt-unicodeやemacsのようなアプリケーションで曖昧な文字幅問題を解決するファイルをメンテしています。
絵文字はNeutralと定義されつつも、多くのフォントでは全角で描かれているという問題があります。 たとえば以下の範囲の文字。 この問題に対処するため、以下の範囲の文字を全角にするという対応を行いました。
- U+2600 - U+27FF (☀☁☂☃)
- U+1F000 - U+1FFFF (🀀🌶🐿🕿)
この範囲以外の絵文字についてはよく分からないのでそのままにしてあります。
こちらで配布されている UTF-8-EAW-FULLWIDTH.gz がちょっと古くなっていたので同じ方法で生成してメンテ出来るようにしました。
-
UTF-8-EAW-FULLWIDTH.gz を /usr/share/i18n/charmaps/ に配置
-
/etc/locale.gen を以下のように変更
#ja_JP.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8-EAW-FULLWIDTH
- locale-gen を実行
libcのロケールを修正する事で、曖昧な文字幅を統一できます。
emacs21 と emacs22 と emacs23以降で対応方法が異なります。 様々なemacsのバージョンで動作するelispを用意していますのでこれを使ってください。
-
eaw.el を ~/.emacs.d/site-lisp/ に配置
-
.emacs に以下を設定する
(add-to-list 'load-path "~/.emacs.d/site-lisp")
(require 'eaw)
(eaw-fullwidth)
.vimrc に、
if exists('&ambw')
set ambw=double
endif
と設定する。
.Xresources などに、
xterm*utf8: 1
xterm*locale: true
xterm*cjkWidth: true
と設定する。
実行オプションに -a 2
を付けるか、
.mlterm/main に、
col_size_of_width_a = 2
と設定する。
絵文字も全角にするには
unicode_full_width_areas = U+2600-27FF,U+1F000-1FFFF
~/.screenrc に
cjkwidth on
と設定する。
~/.w3m/config に
east_asian_width 1
と設定する。
- libcのロケールを修正 -> tmuxのウィンドウ内の表示はA=2に統一できます
- ウィンドウ分割時の罫線は改修が必要です
libcのロケールをA=2に修正した上で、以下の修正が必要でした
diff --git a/tmux.c b/tmux.c
index 5b73079..0377ddd 100644
--- a/tmux.c
+++ b/tmux.c
@@ -202,6 +202,7 @@ main(int argc, char **argv)
errx(1, "need UTF-8 locale (LC_CTYPE) but have %s", s);
}
+ setlocale(LC_CTYPE, "");
setlocale(LC_TIME, "");
tzset();
ターミナルがACSをサポートしている場合、罫線の描画にACSを使うよう設定します。
~/.tmux.conf:
set -ag terminal-overrides ',*:U8=0'
- [Ō] U+014C LATIN CAPITAL LETTER O WITH MACRON: N (neutral)
- [ō] U+014D LATIN SMALL LETTER O WITH MACRON: A (ambiguous)
- [₀] U+2080 SUBSCRIPT ZERO: N (neutral)
- [₁] U+2081 SUBSCRIPT ONE - U+2084 SUBSCRIPT FOUR: A (ambiguous)
- [♠] U+2660 BLACK SPADE SUIT: A (ambiguous)
- [♥] U+2665 BLACK HEART SUIT: A (ambiguous)
- [♣] U+2663 BLACK CLUB SUIT: A (ambiguous)
- [♦] U+2666 BLACK DIAMOND SUIT: N (neutral)