1 件の投稿を表示中 (合計 4 個)
  • 作成者
    投稿
  • #22254
    redakt55
    参加者

    [このフォーラムって文字実体参照を書くと変換されちゃうみたいなので,便宜的に「&」をすべて全角にして投稿します。お手許では半角に修正して試してください]

    面白いバグを見つけました。

    「©」とか「©」のような文字実体参照にカーソルをかざすと,その文字が「©」のようにツールチップ表示される,という機能は非常に便利です。
    ところが,一部の文字で,直前に表示した別の文字実体参照のツールチップが出てしまう,という現象を発見しました。

    【再現手順】
    ①まず,

    あ ㆑ ん

    というテキストを用意。
    (左から順に,「あ」「㆑」(漢文に使うレ点)「ん」です)

    ②左にカーソルをかざす。
    正しく「あ」がチップ表示される。

    ③マウスカーソルをつーっと右に動かして真ん中にかざす。
    レ点ではなく「あ」がチップ表示される(異常)。

    ④そのままつーっと右に動かして右にかざす。
    正しく「ん」がチップ表示される。

    ⑤再び左に動かしていき,真ん中にかざす。
    レ点ではなく「ん」がチップ表示される(異常)。

    さて,面白いのはここからです。

    三つの文字実体参照の間のスペースを改行に変え,

    あ
    ㆑
    ん

    というテキストを用意。

    これで 上→中→下→中 というようにカーソルを動かすと,今度は真ん中にかざしたとき,正しくレ点が表示されます。
    つまり,途中でチップ表示が消えるかどうかで動作が違うようです。

    このような現象を引き起こす文字は,いまのところ ㆐ と ㆑ しか見つけていません。

    #22258
    Yutaka Emura
    キーマスター

    redakt55 様

    いつもお世話になっております。江村です。

    こちらでも再現しました。調べたところ、Windows API の lstrcmpi 関数、CompareString 関数に原因があることがわかりました。

    記録のために書いておくと、

    lstrcmp( L"㆑", L"" )

    を実行すると、片方が空の文字列で、2 つの文字列が異なるため、0 以外の値が戻り値になるはずですが、0 を返しています。

    lstrcmp( L"㆐", L"" )
    
    lstrcmp( L"あい", L"㆐あ㆑い" );

    なども、0 を返してしまいます。どうやら比較の前に、L”㆑” と L”㆐” は、空の文字列と同じとみなされているようです。

    CompareString( LOCALE_INVARIANT, 0, L"㆑", -1, L"", -1 )

    としても同様に CSTR_EQUAL を返しました。

    そこで、代わりに wcscmp を使用すれば問題はなくなるのですが、Windows 内部で lstrcmp (または CompareString) が使われているためか、それだけでは完全に修正できませんでした。一度ツールチップを破壊してから、再作成すればいいかもしれませんが、パフォーマンスに影響を与える可能性があるため行っていません。将来のバージョンでは、別の方法で修正を検討します。

    よろしくお願い申し上げます。

    #22262
    redakt55
    参加者

    難しくてよく分からないのですが,要するに Windows のバグってことですね?
    こういう問題を引き起こす文字が少ししか無いのであればすぐに直らなくてもいいです。

    #22267
    Yutaka Emura
    キーマスター

    redakt55 様

    いつもお世話になっております。江村です。

    これは Windows の不具合としか思えないです。さきほど公開した v15.7.2 で対応いたしました。

    今後もよろしくお願い申し上げます。

1 件の投稿を表示中 (合計 4 個)
  • このトピックに返信するにはログインしてください。