|
こんにちは。秀丸愛用者の「でるもんた・いいじま」です。
> 「普通でない」文字すなわち複数のスカラー値からなる
> 「書記素クラスタ」は正しく構成スカラー値のサイズの
> 合計となるのでしょうか?
>
> 例えば、「女性消防士」を表す絵文字は
> U+1F469 (サロゲートペア) +
> U+1F3FD (サロゲートペア) +
> U+200D (通常スカラー値) +
> U+1F692 (サロゲートペア)
> となっているのですが、wcslen()はこれを正しく 2 + 2 + 1 + 2 = 7文字と
> 返してくれるのでしょうか?
実験してみました。実際に7になります。
$a = unichar(0x1F469) + unichar(0x1F3FD) + unichar(0x200D) + unichar(0x1F692);
message sprintf("wcslen('%s') == %d\n", $a, wcslen($a));
あるいは、こんなテストコードに実際に入力してみることもできます。
while (1)
{
$a = input("Enter some text.");
if ( !result ) endmacro;
message sprintf("wcslen('%s')==%d", $a, wcslen($a) );
}
☆ ☆ ☆
> また、同じ文字が複数の種類の異なるコードポイントで表現可能な
> ときにはwcslen()はどのように振る舞うのでしょうか?
これは、
「秀丸はコードの正規化を行わない」
「バイナリ表現が異なれば、意味するものが同一でもそれぞれ異なる文字列として扱
う」
というのが正解になると思います。
なので、
> 例えば、「ắ」という文字は
> U+1EAF
> U+0103 + U+0301
> U+0301 + U+0306 + U+0301
> の3種類で表現可能ですが、スカラー値のサイズの合計も
> 上から1文字、2文字、3文字、と異なっているのですが、
> wcslen()はこの3つのどれを採用するのでしょうか?
この例でいえば、wcslenはこのそれぞれのコード列に対してそれぞれ異なる値(つま
り、順に1、2、3)が返ります。
$a = unichar(0x1EAF);
$b = unichar(0x0103) + unichar(0x0301);
$c = unichar(0x0101) + unichar(0x0306) + unichar(0x0301);
message sprintf("[%s]:%d\n[%s]:%d\n[%s]:%d\n",
$a, wcslen($a), $b, wcslen($b), $c, wcslen($c));
また、この3つの文字列を等号で比較したり、strstr() でマッチングさせたりしても、
内部表現が異なっていれば同じ文字列とはみなされません。
$a = unichar(0x1EAF);
$b = unichar(0x0103) + unichar(0x0301);
message sprintf("($a==$b)==%d, strstr($a,$b)=%d\n", ($a==$b), strstr($a,$b));
検索でも同様です。
setcompatiblemode 0x20000;
$a = unichar(0x1EAF);
$b = unichar(0x0103) + unichar(0x0301);
insert sprintf( "Here is the patterns: '%s' and '%s'.\n", $a, $b);
searchdown "[\\u1EAF]", regular, hilight, loop;
#ところで3番目のパターン、最初のU+0301はU+0101か何かの間違いですよね?
#合成用文字だけが3つ並んでいて、そのベースになる文字がありませんので。
☆ ☆ ☆
もし unichar() では心配ということであれば、マクロファイルを「UTF-16LEのBOMつ
き」または「UTF-8のBOMつき」で保存すれば大抵のものは文字列の中にそのまま書け
るはずですので、ぜひそれでテストコードを色々と書いてみてください。
☆ ☆ ☆
後半の件につきましては担当さんからのお返事をお待ちください。
|
|