I had the requirement to check which of the fonts installed on my machine supported Japanese numerals. The easiest way to actually verify this was by doing it through a Powershell script.
The method below only works on Windows machines since it relies on the PresentationCore assembly.
param (
[switch] $Verbose
)
Add-Type -AssemblyName PresentationCore
# List of Japanese numerals to check
$japaneseNumerals = @(
[char] 0x4E00, # 一
[char] 0x4E8C, # 二
[char] 0x4E09, # 三
[char] 0x56DB, # 四
[char] 0x4E94, # 五
[char] 0x516D, # 六
[char] 0x4E03, # 七
[char] 0x516B, # 八
[char] 0x4E5D, # 九
[char] 0x5341 # 十
)
# Function to check if a font contains a specific glyph
function FontSupportsCharacter {
param (
# The font name to check
[string] $fontName,
# The character to check
[char] $character
)
try {
# Create a GlyphTypeface object for the font
$typefaces = (New-Object System.Windows.Media.FontFamily($fontName)).GetTypefaces()
foreach ($typeface in $typefaces) {
$glyphTypeface = $null
$typeface.TryGetGlyphTypeface([ref]$glyphTypeface) | Out-Null
if ($glyphTypeface -and $glyphTypeface.CharacterToGlyphMap.ContainsKey([int][char]$character)) {
return $true
}
}
} catch {
# Handle errors, e.g., if the font cannot be loaded
Write-Verbose -Message "Error loading font: ${fontName}"
}
return $false
}
if ($Verbose) {
$VerbosePreference = "Continue"
}
# Get all installed fonts
$installedFonts = (New-Object System.Drawing.Text.InstalledFontCollection).Families
# Loop through each installed font
foreach ($font in $installedFonts) {
$glyphFound = $true
foreach ($numeral in $japaneseNumerals) {
$exists = FontSupportsCharacter -fontName $font.Name -character $numeral
if (-not $exists) {
$glyphFound = $false
Write-Verbose -Message "Font `"$($font.Name)`" does NOT contain glyph for `"${numeral}`" (U+$([System.String]::Format("{0:X4}", [int][char]$numeral)))."
break
}
}
if ($glyphFound) {
Write-Output "Font `"$($font.Name)`" contains all Japanese numerals."
}
}
Personally, I would expect the operating system to be able to filter fonts, but unfortunately it falls to the user to gain these insights.