2013年11月27日水曜日

Windows 8.1:CJKフォント変化とU+200Xの空白文字

まだ8がCP版だった頃、コメントのU+2001に未知の幅があるという話を書きました。
他の特殊文字と同様、これもSegoe UI Symbolなのでは?とその時は思ったのですが、どうも違うようです。

下図は上段がSimSun化したコメント、下段がGulim化したコメントです。フォント変化文字の間に幅の異なる空白文字、U+2001・U+2002・U+2009を挟んでいます。8.1と7で表示に差異はありません。


これらの空白文字はSimSunにもGulimにもありません。フォントリンクにより代替表示がされていると思われます。フォントリンクは8.1も7も同じで、MICROSS.TTF(Microsoft Sans Serif)が参照されているはずです。


このコメントの最後の文字を罫線記号のU+2500に変更してみます。8.1と7とで表示が変わりました。


ここでなぜU+2500を使用したかは、話が長くなるので割愛します。
8.1の方では、幅が異なる空白文字が同じ幅に変わってしまったように見えます。似たような現象をXPで見たことがあります。


しかし8.1とXPでは状況が異なります。XPのMicrosoft Sans SerifにU+200Xの空白文字はありません。と言うか、フォントリンクの登録もありません。XPで表示されているSimSunの全角幅の空白、およびGulimの「は未定義(表示するものが無い)を表していると思われます。

試しに8.1でもXPと同じ状況にしてみます。8.1・7のフォントリンク先でU+200Xを持っているのは、Microsoft Sans SerifとMS P明朝(SimSun)/MS UI Gothic(Gulim)です。これらをフォントリンク先から削除してOSを再起動すると、XPと同じ表示になります。


8.1で空白文字が同じ幅になったのはXPのような未定義ではなく、元々U+200Xが同じ幅で定義されているフォントにフォールバックされたのではないか?と思いました。もっとも、それはSegoe UI Symbolではないようです。

Export Font Glyphs - BabelMap

調べてみると、他のフォントではそういうケースもあるようでした。このコメントの話とは直接関係ないと思いますが、例えば下図はConsolasというフォントの場合です。

Export Font Glyphs - BabelMap

MS ゴシックやMS 明朝でもU+2002とU+2009が同じだったりしました。なんなのか特定には至りませんでした。

さて、このように8.1と7で表示に違いが出てしまう場合の対処です。
トリガーとなったU+2500とその前の文字との間にArialを挟むだけで直ります。下図はゼロ幅のU+200Cを挟んでいます。


とは言うものの、そもそもCJKフォント変化させたコメントでU+200Xの空白文字を使うのはChromeとの互換性で問題が発生します。下図はSimSun化のコメントについて、Chromeで縮むU+2588をU+2587に、U+2500をU+2501に変えてIEの表示と比較しているところです。


IEのU+200XがMicrosoft Sans Serifなのに対して、ChromeはArialだと思われます。Arialの方が幅が広いようです。互換性を図るのであれば各フォント変化文字とU+200Xの間にArialを挟み、IEのU+200XもArialにする必要があるでしょう。


上のコメントはXPではU+200Xが豆腐になりますが。


これはXPのArialにU+200Xが無いためでしょう。例えばU+2001のあるフォントを調べると、8.1とXPとでは下図のような差があります。

Font Coverage - BabelMap

XPを考慮する必要がなくなれば、上のようなやり方もアリだろうと思います。

0 件のコメント:

コメントを投稿