2014年8月21日木曜日

U+06E5による左右反転

以前Chromeでのコメント幅の縮みを補完するのに、アラビア文字のU+06E5を試したことがありました(→この日記)。後になってから、この文字で妙な挙動が起きることに気づきました。

下図の2・4段目のコメントは、それぞれ1・3段目のコメントの左右2文字目にU+06E5を追加したものです。


U+06E5が1つであれば何も起こらないのですが、このように複数あるとその間で文字の並びが左右反転します。

左右反転は必ず起こるわけではなく、下図のようにアルファベットや漢字、かな文字などでは発生しません。


また冒頭のように反転が起こるケースでも、途中にアルファベットや漢字が混ざると発生しなくなります。下図の1~4段目の各コメントは、いずれも左右の2文字目にU+06E5を追加してあります。


右側の図が示す通り、これらの挙動はChrome上でも変わりません。

IEの場合、反転が起きたトランプマークはGulim・ブロック文字はSimSunです。一方起きなかったアルファベットはArial・漢字はゴシックです。ただしゴシックでも左右反転するケースもありました。
下図の丸囲み数字はゴシックだと思います。1段目の左右2文字目にU+06E5を追加したのが2段目です。


そもそもフォントが異なるChromeでも同じ挙動を取るので、フォントの種類の問題ではないようです。文字によって左右反転を適用するかどうか判定しているように見えます。

IEとChromeで挙動が異なるケースもあります。下図のコメントはいずれも左右の2文字目にU+06E5を追加してあります。


真ん中の丸囲み数字は、IE上でのコメントのフォント状態(1・2段目Gulim、3・4段目SimSun)に対してCJKコードページ的にGulim属性・SimSun属性の有無が異なるものをわざと選んでいます。

unicode 字形 cp932 cp936 cp949 cp950
246E 874E - A8F5 -
246F 874F - - -

unicode 字形 cp932 cp936 cp949 cp950
2469 8749 A2E2 A8F0 -
246A 874A - A8F1 -

このケースに関してはCJKが関係あるように見えます。CJKフォント変化が起こらないChromeではどのコメントでも左右反転が起きています。
IE上でこれらの丸囲み数字があっても、コメントのフォント状態自体は変わらないはずです。 U+06E5から見て一体何をどう判定しているのか、興味があります。

2014年8月4日月曜日

Excel 2013/2010:意図しないListBoxコントロールのリサイズ

ListBoxコントロールのサイズが勝手に変わってしまうことがあります。IntegralHeightをFalseにすれば避けられると思っていたのですが、どうもそう単純ではないようなので少し試してみました。

下図はWindows 7上のExcel 2010でシートに配置したListBoxコントロールです。AddItemで項目が追加されるようになっています。これをWindows 8.1上のExcel 2013で実行すると、見た目の結果が異なりました。


IntegralHeightがTrueの場合、Windows 8.1上ではListBoxコントロールが元のサイズより大きくなってしまいました。 IntegralHeightがFalseの場合このリサイズは起こらず、代わりに中の文字が小さくなりました。

逆にWindows 8.1上のExcel 2013で同じものを作ってみると、Windows 7上のExcel 2010で実行してもこのようなことは起こりませんでした。


実際には若干サイズが変わっているようですが、冒頭の例ほど大きな違いはありません。

念のため、画面の解像度が異なる場合も見てみました。同じWindows 7上のExcel 2010でも、解像度が異なると冒頭と同じ結果になりました。8.1上の2013でも同様でした。

Windows 7(解像度:1920×1200)・Excel 2010で作成

一方、8.1上の2013で作ったものは解像度が違ってもこのようなことは起こりませんでした。また、7上の2010でも結果は同じでした。

Windows 8.1(解像度:1920×1200)・Excel 2013で作成

ExcelよりWindowsのバージョンの違いに原因があるのでしょうか。
ちなみにWindows 7上のExcel 2013で作成した場合は結果が少し異なりました。AddItemを実行する前、ActiveXコントロールをアクティブにした時点でリサイズが起こりました。

Windows 7(解像度:1920×1200)・Excel 2013で作成

これはIntegralHeightの値は関係ありませんでした。

8.1上で作成できれば問題はなさそうです。7で作成せざるを得ない場合は、AddItem実行後にHeightとWidthを設定し直すくらいしか対処法は思いつきませんでした。なんか腑に落ちませんが。