ヘッダー
Python サンプル集
 

フォントに指定した文字が収録されているか確認する

2022/11/6

→ C# のサンプルに切り替える → Visual Basic のサンプルに切り替える

 

文字「桜」がフォント「メイリオ」に収録されているか調べる

この例は Windows のみを対象としています。

from fontTools.ttLib import TTFont
import glob
import sys

codePoint = ord('桜')
#codePoint = 0x685C #Unicodeでのコードポイントを直接指定することもできます。

#フォント名の例 "メイリオ", "Meiryo", "MS Mincho" ,"MS 明朝", "Arial", "Segoe UI Emoji"
fontName = 'メイリオ'

#■1段階目:フォント名(日本語か英語)からフォントファイルを取得する

fontPath = r'C:\Windows\Fonts'
fontFileName = ''

for fileName in glob.glob(f'{fontPath}\*'):
    if not (fileName.upper().endswith('.TTF') or fileName.upper().endswith('.TTC')):
        #拡張子 .ttf または .ttc 以外のファイルは扱いません。
        continue

    font = TTFont(fileName, fontNumber=0)
    names = font['name'].names

    jpName = ''
    enName = ''

    for name in names:
        #platformID 3 は Windows です。Windowsだけ対応しました。(力尽きました。)
        #https://learn.microsoft.com/ja-jp/typography/opentype/spec/name

        #日本語でのフォント名(存在しない場合もあります) 
        if name.platformID == 3 and name.langID == 0x0411 and name.nameID == 1:
            jpName = name.string.decode('utf-16-be')

        #英語でのフォント名
        if name.platformID == 3 and name.langID == 0x0409 and name.nameID == 1:
            enName = name.string.decode('utf-16-be')

        if jpName == fontName or enName == fontName:
            fontFileName = fileName
            break

    if len(fontFileName) > 0:
        break

else:
    print(f'名前が {fontName} のフォントは見つかりませんでした。')
    sys.exit()

#■2段階目:フォントファイルに文字が収録されているか確認する
print (f'フォントファイル:{fontFileName}')
font = TTFont(fontFileName, fontNumber=0)
cmap = list(font.getBestCmap()) 

letter = chr(codePoint)
if codePoint in cmap:
    #出力例 メイリオ に 桜 (0685C) は収録されています。
    print(f'{fontName}  {letter} ({codePoint:05X}) は収録されています。')
else:
    #出力例 Arial に 桜 (0685C) は収録されていません。
    print(f'{fontName}  {letter} ({codePoint:05X}) は収録されていません。')

メモ:ごめんなさい。このプログラムはなかなか大変で力尽きました。参考程度にご活用ください。

メモ:このプログラムを実行するには fonttools をインストールする必要があります。その一般的な方法は pip install fonttools コマンドの実行です。fonttoolsについてはこちらを参照してください。 https://fonttools.readthedocs.io/en/latest/

 

 

文字「桜」がフォントファイル「meiryo.ttc」に収録されているか調べる

from fontTools.ttLib import TTFont

codePoint = code = ord('桜')
#codePoint = 0x685C #Unicodeでのコードポイントを直接指定することもできます。

#フォントファイル名の例 "meiryo.ttc", "arial.ttf"
fontFileName = r'C:\Windows\Fonts\meiryo.ttc'
font = TTFont(fontFileName, fontNumber=0)
cmap = list(font.getBestCmap()) 

letter = chr(codePoint)
if codePoint in cmap:
    #出力例 C:\Windows\Fonts\meiryo.ttc に 桜 (0685C) は収録されています。
    print(f'{fontFileName}  {letter} ({codePoint:05X}) は収録されています。')
else:
    #出力例 C:\Windows\Fonts\meiryo.ttc に 桜 (0685C) は収録されていません。
    print(f'{fontFileName}  {letter} ({codePoint:05X}) は収録されていません。')

メモ:このプログラムを実行するには fonttools をインストールする必要があります。その一般的な方法は pip install fonttools コマンドの実行です。fonttoolsについてはこちらを参照してください。 https://fonttools.readthedocs.io/en/latest/

 

 

古代エジプトの象形文字(ヒエログリグ)がフォント「Segoe UI Historic」に収録されているか調べる

この例は Windows のみを対象としています。

from fontTools.ttLib import TTFont
import glob
import sys

codePoint = 0x13000 #Unicodeで定義されているヒエログリフの1文字目
#フォント名の例 "メイリオ", "Meiryo", "MS Mincho" ,"MS 明朝", "Arial", "Segoe UI Emoji"
fontName = 'Segoe UI Historic'

#■1段階目:フォント名(日本語か英語)からフォントファイルを取得する

fontPath = r'C:\Windows\Fonts'
fontFileName = ''

for fileName in glob.glob(f'{fontPath}\*'):
    if not (fileName.upper().endswith('.TTF') or fileName.upper().endswith('.TTC')):
        #拡張子 .ttf または .ttc 以外のファイルは扱いません。
        continue

    font = TTFont(fileName, fontNumber=0)
    names = font['name'].names

    jpName = ''
    enName = ''

    for name in names:
        #platformID 3 は Windows です。Windowsだけ対応しました。(力尽きました。)
        #https://learn.microsoft.com/ja-jp/typography/opentype/spec/name

        #日本語でのフォント名(存在しない場合もあります) 
        if name.platformID == 3 and name.langID == 0x0411 and name.nameID == 1:
            jpName = name.string.decode('utf-16-be')

        #英語でのフォント名
        if name.platformID == 3 and name.langID == 0x0409 and name.nameID == 1:
            enName = name.string.decode('utf-16-be')

        if jpName == fontName or enName == fontName:
            fontFileName = fileName
            break

    if len(fontFileName) > 0:
        break

else:
    print(f'名前が {fontName} のフォントは見つかりませんでした。')
    sys.exit()

#■2段階目:フォントファイルに文字が収録されているか確認する
print (f'フォントファイル:{fontFileName}')
font = TTFont(fontFileName, fontNumber=0)
cmap = list(font.getBestCmap()) 

letter = chr(codePoint)
if codePoint in cmap:
    #出力例 Segoe UI Historic に 𓀀 (13000) は収録されています。 ← この例ではこれが表示されます。
    print(f'{fontName}  {letter} ({codePoint:05X}) は収録されています。')
else:
    #出力例 Segoe UI Historic に 𓀀 (13000) は収録されていません。
    print(f'{fontName}  {letter} ({codePoint:05X}) は収録されていません。')

メモ:ごめんなさい。このプログラムはなかなか大変で力尽きました。参考程度にご活用ください。

メモ:このプログラムを実行するには fonttools をインストールする必要があります。その一般的な方法は pip install fonttools コマンドの実行です。fonttoolsについてはこちらを参照してください。 https://fonttools.readthedocs.io/en/latest/

メモ:コードポイント 13000 はこの文字です。