[Mutt-j-users 292] Re: tt.widthパッチについて質問

Back to archive index

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/




Mutt-j-users メーリングリストの案内
Back to archive index