Как я могу перечислить шрифты с глифами для определенного алфавита (в Windows)?

588
einpoklum

Шрифты (в Windows, но не только) обычно не содержат глифов для всех языков. На самом деле, большинство из них имеют глифы только для одного языка или, вернее, одного алфавита.

Я хочу перечислить все шрифты в моей системе (или, по крайней мере, все семейства шрифтов), которые имеют глифы для определенного алфавита. Я знаю, что некоторые приложения делают это внутренне (например, Adobe Photoshop), а другие делают это (например, различие между Microsoft Word и латинским в сложных словах). Как я могу сделать это сам?

Заметки:

  • Я особенно заинтересован в иврите, но мой вопрос для общего случая.
  • Если это поможет, предположим, что у меня установлен Cygwin.
6
Пожалуйста, проверьте это обсуждение с похожей проблемой, как у вас: http://superuser.com/questions/866189/deterministic-way-to-find-which-installed-fonts-support-a-given-unicode-characte/866191#866191 Romeo Ninov 9 лет назад 1

1 ответ на вопрос

2
Ben N

Based on this StackOverflow answer, I wrote this PowerShell script:

$charId = [Int32][char]$args[0] [System.Reflection.Assembly]::LoadWithPartialName("PresentationCore") | Out-Null [System.Windows.Media.Fonts]::GetFontFamilies("C:\Windows\Fonts") | ForEach-Object { foreach ($face in $_.GetTypefaces()) { $glyph = $null $face.TryGetGlyphTypeface([ref]$glyph) | Out-Null if ($glyph -and $glyph.CharacterToGlyphMap.TryGetValue($charId, [ref]0)) { $_.Source.Split("#")[1] break } } } 

Save it as a file with a ps1 extension; I called it fonttest.ps1.

Before PowerShell will let you run scripts, you'll need to do Set-ExecutionPolicy Unrestricted -Scope CurrentUser. Then you can run it like so:

.\fonttest.ps1 你 

The .\ is important, and you'll need to be in the same directory as where you saved the script. That last character is the one you want to test all fonts for. You'll get a printout of all font families that have a glyph for that character. On my computer, the above command produced this:

Microsoft JhengHei Microsoft JhengHei UI Microsoft YaHei Microsoft YaHei UI Yu Gothic MS Mincho MS PMincho DFKai-SB SimHei KaiTi SimSun NSimSun Meiryo Meiryo UI MS Gothic MS UI Gothic MS PGothic FangSong Yu Mincho MingLiU PMingLiU MingLiU_HKSCS Arial Unicode MS Adobe Fangsong Std Adobe Fan Heiti Std Adobe Heiti Std Adobe Kaiti Std Kozuka Gothic Pro Kozuka Mincho Pro Adobe Ming Std Adobe Song Std Kozuka Gothic Pr6N Kozuka Mincho Pr6N DengXian Microsoft MHei 
1. Спасибо, что пошли на эту неприятность! 2. (Не?) К счастью, я не пользуюсь Windows в наши дни, поэтому - я не могу протестировать этот скрипт. 3. Что вы подразумеваете под "Set-ExecutionPolicy Unrestricted -Scope CurrentUser"? Это включает в себя утилиту редактора политики? Можете ли вы сослаться куда-нибудь, объясняя, как это сделать? einpoklum 8 лет назад 0
@einpoklum Это просто команда, которую нужно ввести в командной строке PowerShell. (Я уверен, что есть эквивалентный параметр групповой политики, но проще набрать команду.) Ben N 8 лет назад 1