[PHP-dev 1385] Re: mb_strwidth関数とmb_strimwidth関数の挙動について

ISHIDA Akio iakio @ mono-space.net
2007年 8月 9日 (木) 18:59:46 JST


はじめまして。石田@苫小牧市と申します。

( http://www.mono-space.net/blog/programming/051026_php_mbfl.htm
を書いた人です )

若干話を混乱させてしまうかもしれませんが、、、
PostgreSQLの内部でも、文字の表示上の幅を得る関数があります。
これは各エンコード毎に関数があったのですが(pg_euc_dsplen等)
そのunicode版であるpg_utf_dsplenがどうなっているかという
話です。

http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/mb/wchar.c?annotate=1.63

この466-639行目あたりがソレです。

ポイントは、

- 冒頭のコメントにあるように、
"The Single UNIX Specification, Version 2, The Open Group, 1997"
を参考にして書かれたpublic domainのコードをカスタマイズしている
ようです。

- 現在のPHPの実装と同じように、http://www.unicode.org/reports/tr11/
を参照しているようですが、詳しく比べてませんが
全角かどうかの判定はわりとざっくり(!?)やっているように
見えます。

- しかし一番違うのは、pg_utf_dsplenは0を返すケースがあります。
542行からの static const struct mbinterval combining[]
はすべて幅0の文字のようです。

これは、単体のアクセント記号(要するに2つ合わせて1つになる文字)
や、非可視整形用文字、ZERO WIDTH SPACEなどが含まれているようです。

結局話をどっちにもっていたらいいのか私にもよくわかりませんが^^;;
ご参考までということです。

あと、おまけですが、CP932.TXT の中で、
East Asian Ambiguous (A) となっているものを調べたところ
178文字ありました。


-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>


PHP-dev メーリングリストの案内