misc.log

日常茶飯事とお仕事と

日本語フォント名から英語フォント名を取得する

昨年の話なんですが、記録し忘れていたので。

米国製のコンポーネントGUIを伴うもので、テキスト入力なども処理する)を利用していて、フォント名プロパティに日本語フォント名を指定すると、次にフォント設定を表示させたらフォント名が文字化け、おまけにフォント自体も「フォントが無かった時に指定される標準的なもの」が選択されて外観が変わってしまうという問題が。

まぁコンポーネント側が国際化対応仕切れてないのが根本的にまずいのでしょうけど、そんなのを対応してもらうのを待ってるわけにはいかないので、フォント選択用ダイアログで指定されたあと、日本語フォント名を元に、対応する英語フォント名を取得するロジックを用意しました。

たとえば

  • MS ゴシック → MS Gothic
  • MS Pゴシック → MS PGothic
  • MS 明朝 → MS Mincho
  • MS P明朝 → MS PMincho

のように変換します。こうすれば、日本語対応していないツールでもとりあえず受け付けてくれました。

もっと洗練された方法があるのかもしれませんが、とりあえず動きます(笑)。ロジックはこんな。

''' <summary>
''' 日本語フォント名から英語フォント名を取得する。
''' </summary>
''' <param name="jpnName">日本語フォント名文字列。</param>
''' <returns>英語フォント名文字列。</returns>
''' <remarks>
''' 英語名が無い場合は日本語名がそのまま返されます。
''' </remarks>
Protected Function GetEnglishFontName(ByVal jpnName As String) As String

    Dim fontCollection As New System.Drawing.Text.InstalledFontCollection
    Dim fonts As Drawing.FontFamily() = fontCollection.Families

    Dim cultureId As Integer = System.Globalization.CultureInfo.GetCultureInfo("en-us").LCID
    Dim result As String = String.Empty

    For Each ff As Drawing.FontFamily In fonts
        If ff.Name = jpnName Then
            result = ff.GetName(cultureId)
            Exit For
        End If
    Next

    If String.IsNullOrEmpty(result) Then
        result = jpnName
    End If

    Return result

End Function

元ネタはここにある「インストールされているフォント取得」のロジックだったような…(覚えてません)。

DOBON.NETプログラミング道/インストールされているフォントを取得する
http://dobon.net/vb/dotnet/system/getinstalledfonts.html

和文フリーフォント集

和文フリーフォント集