Windows ストアアプリで合字処理が出た場合

#win8dev_jp

■ シリーズになっちゃいました。

■ さて本題

Windows ストアアプリでフォントを変えたときにこんな風になってしまう場合があります。

※標準合字について追記しました。

image

なにか、違う会社に見えます。

ここには合字という文字合成をする処理が2種類発生してしまっています。

  • マイクロが1文字になってしまっているのが随意合字
  • ff がつながって表示されているのが標準合字

■ 発生状況

これは、TextBlock 等で以下の設定をした場合に起きる問題です。

  • Yu Gothic や Yu Mincho を Meiryo をフォントして設定
  • 標準で用意されている HeaderTextBlockStyle をスタイルとして設定
    ただし、Grid Template などのタイトルなどにはデフォルトで設定されている

XAMLで見るとこの2点があることがポイントです。

<TextBlock
   Text="マイクロソフト株式会社"
   FontFamily =" Yu Gothic "  
   FontSize="48"
   Style =" {StaticResource HeaderTextBlockStyle} "
/>

■ 原因

これは、HeaderTextBlockStyle の中に合字を有効にするプロパティが設定されているためです。

  • 随意合字を有効にする Typography.DiscretionaryLigatures="True"
  • 標準合字を有効にする Typography.StandardLigatures="True"  

随意合字

Typography.DiscretionaryLigatures プロパティ
https://msdn.microsoft.com/ja-jp/library/system.windows.documents.typography.discretionaryligatures.aspx

clip_image001

標準合字

Typography.StandardLigatures プロパティ
https://msdn.microsoft.com/ja-jp/library/system.windows.documents.typography.standardligatures.aspx

image

■ 解決方法

回避するには前述の条件を外すのが簡単。下記のどちらかをやればよし。

  • Yu Gothic や Yu Mincho を Meiryo をフォンとして使わない
  • 標準で用意されている HeaderTextBlockStyle をスタイルとして使わない

ま、特に後者ですね。特にスタイルを必要としなければ外せばよいです。その際はフォントサイズを合わせておきましょう。

スタイル内の合字プロパティを無効にする

まぁ、でもそれでは、根本解決にはならないので、きちんとこのフォント装飾の設定を外す方法をご紹介します。

回避するには単純に TextBlock に各プロパティの無効設定を追記すればOKです。

  • Typography.DiscretionaryLigatures="False"
  • Typography.StandardLigatures=”False”

こんな感じですね。

<TextBlock
   Text="マイクロソフト株式会社"
   FontFamily="Yu Gothic"
   Typography.DiscretionaryLigatures =" False "
   Typography.StandardLigatures=”False”  
   FontSize="48"
   Style="{StaticResource HeaderTextBlockStyle}"
/>

image

マイクロ や 株式会社 がきちんと4文字になり、ffの間も空いていることがわかります。

■ その他

なぜこんなものが入っているのか、誰得なのか?正直疑問はあると思いますが、それをここで論じてもしょうがないので、ひとまず解決のための情報として把握しておいてください。

遊ゴシックや遊明朝はうまく使うと美しいフォントです。ぜひ上記に注意して試してみてください。

ちなみに、遊明朝の場合、マイクロには随意合字は用意されておらず、株式会社にのみ随意郷地があるようです。標準合字はffにはないみたい。

image

この辺はフォントに依存するので難しいところです。たぶんMicrosoft チェックしているのは UIフォントについてのみだと思います。