Python サンプル集 |
Visual Basic 中学校 > Python サンプル集 > 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 はこの文字です。