TAKIZAWA Takashi
taki****@cyber*****
2011年 3月 4日 (金) 00:40:50 JST
滝澤です。 On Thu, Mar 03, 2011 at 11:15:30AM +0900, gwmaster wrote: > tt.widthパッチには > > +int wcwidth_cjk(wchar_t ucs) > +{ > + /* sorted list of non-overlapping intervals of East Asian Ambiguous > + * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ > + static const struct interval ambiguous[] = { > + { 0x00a1, 0x00a1 }, { 0x00a4, 0x00a4 }, { 0x00a7, 0x00a8 }, > > という行があります。 Muttのwcwidth.cはMarkus Kuhn氏が作ったものをベースに手を加えているものです。 http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c Muttに含まれているものは古いので、tt.widthパッチでは最新のものに更新する ようにしています。 > 1) uniset コマンドというのはどこから来たのでしょうか。 上記の該当する箇所はオリジナルのままなので私にもわかりません。 > 2) 0x00a1 というのは、ひっくり返ったびっくりマークです。 > gnome terminalやWindowsで見ると1バイト幅のようなのですが、 > 0x00a2 の間違いではないでしょうか。 間違いではないです。 このwcwidth_cjk()はUnicode Standard Annex #11に準拠しています。 http://www.unicode.org/reports/tr11/ 文字幅を規定しているデータはこれです。 http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt 一部を抜粋するとこうです。 00A0;N # NO-BREAK SPACE 00A1;A # INVERTED EXCLAMATION MARK 00A2;Na # CENT SIGN 00A3;Na # POUND SIGN 00A4;A # CURRENCY SIGN 00A5;Na # YEN SIGN 00A6;Na # BROKEN BAR 00A7;A # SECTION SIGN 00A8;A # DIAERESIS 00A9;N # COPYRIGHT SIGN 00A1については"A"(Ambiguous)となっているので全角(2桁)か半角(1桁)のどち らで扱ってもよい文字となっています。 wcwidth_cjk()ではAmbiguousな文字の幅を2桁として扱っています。 00A1の文字は元々は日本語のフォントとしては存在しなかったのですが、JIS X 0213 にこの記号が含まれているので微妙に扱えるようになっています。 しかし、ターミナルソフトのCJK(East Asian Ambiguous)の処理がJIS X 0213に対応 しているかどうかにもよります。対応していなければ1桁の文字として表示しますし、 対応していればCJKの処理として2桁の文字として扱うはずです。 ここら辺の問題は wcwidth(), TUIのソフトウェア(ここではMutt)、ターミナル ソフトウェア、フォントのすべてがEast Asian Ambiguousに対応していないと正しく 表示できません。 また、日本語のフォントでは全角(2桁)文字として扱っている00A2,00A3,00A5, 00A6が"Na"(Nallow)として記載されているので、実情に合うように、次のような パッチとして追加しています。 + /* For Japanese legacy encodings, the following characters are added. */ + static const struct interval legacy_ja[] = { + { 0x00A2, 0x00A3 }, { 0x00A5, 0x00A6 }, { 0x00AC, 0x00AC }, + { 0x00AF, 0x00AF }, { 0x2212, 0x2212 } + }; 略 + if (bisearch(ucs, legacy_ja, + sizeof(legacy_ja) / sizeof(struct interval) - 1)) + return 2; -- TAKIZAWA Takashi(滝澤 隆史) http://www.emaillab.org/