"Roman"として読み込み可能であるかどうかを明白に定義するフォントに明示的な情報はありません。
グリフ解析を使用して、フォントがカバーするUnicode範囲を確認することができます。これは、あなたがどの言語のフォントをカバーしているかの手がかりを与えることができます。ただし、これには問題があります。例:
- デフォルトのWindows 7フォントは "Segoe UI"です。あなたのスキームでは、これを「ローマ字」フォントと見なしますか?グリフ解析を実行しても、ラテン文字だけでなく、他のUnicode範囲もカバーしています。アラビア語、タイ語。さて、少なくともラテン文字をカバーするフォントを含めることはできますが、ラテン文字の範囲がポイント3のようにラテン文字として実際には読み込めない場合はどうしますか?
- "Mongolian Baiti"の例には、基本的なラテン語の範囲をカバーするグリフが含まれているため、 "ローマ字"のテキストのレンダリングに使用できます。
- Webdingsはラテン語の範囲をカバーしているため、解析を通ることはできますが、実際には読みやすいラテン文字は含まれていません。
おそらく狭いものにグリフ解析を適用することはできますが、誤検出が起こる可能性があります。
更新
私は自分のアプリケーションでフォントリストに対処する必要が、これだけでは、このいずれかを残すことができませんでした! :)
実際には、フォントがGlyphTypeface.Symbolプロパティ(私には新しさ)を介してシンボルフォントかどうかを派生させることができます。したがって、これと少しのグリフ解析では、以下の解決策が必要です。
しかし、これはラテン文字のためのグリフを持っているので、それはまだ "ロン"フォントであるので、 "モンゴルのBaiti"(とカリースタイルでは "Balti"ではなく "Baiti"あなたはこれを定義します。実際、私のシステム上のSymbol以外のフォントはすべて、少なくともラテン文字の範囲を持っているので、ラテンのグリフテストは実際にはどのフォントも除外しません。
"Mongolian Baiti"に対するあなたの特別な反対は何ですか?手動で管理されている除外リストを使わずに自動的に除外する予定はどうですか?
[Test]
public void test()
{
var fonts = Fonts.SystemFontFamilies.OrderBy(x => x.ToString());
var latinFonts = fonts.Where(f =>
f.Source.StartsWith("Global") ||
(!IsSymbol(f) && HasLatinGlyphs(f)));
latinFonts.ToList().ForEach(Console.WriteLine);
}
private bool IsSymbol(FontFamily fontFamily)
{
GlyphTypeface glyph = GetFirstGlpyhTypeface(fontFamily);
return glyph.Symbol;
}
private bool HasLatinGlyphs(FontFamily fontFamily)
{
GlyphTypeface glyph = GetFirstGlpyhTypeface(fontFamily);
for (int i = 32; i < 127; i++)
{
if (!glyph.CharacterToGlyphMap.ContainsKey(i)) return false;
}
return true;
}
private GlyphTypeface GetFirstGlpyhTypeface(FontFamily fontFamily)
{
Typeface typeface = fontFamily.GetTypefaces().First();
GlyphTypeface glyph;
typeface.TryGetGlyphTypeface(out glyph);
return glyph;
}
アップデート2
あなたは、彼らがLatin Extended-A
とLatin Extended-B
範囲のためのフィルタを含むことによって、拡張ラテン文字のために持っているもののサポートに基づいてフォントをフィルタリングで実験ができます。 Latin Extended-A
とLatin Extended-B
の両方でフィルタリングすると、ほとんどフォントが残っていませんが、Latin Extended-A
でフィルタリングするだけで、まだかなりのフォントが残っています。これはLatin-1
とLatin-1 Supplement
のみをサポートしているため、Mongolian Baiti
も自動的に削除されます。
このような分析が望ましい結果をもたらすかどうかは、非常に主観的です。 、再び、非常に主観的
private bool HasLatinGlyphs(FontFamily fontFamily)
{
GlyphTypeface glyph = GetFirstGlpyhTypeface(fontFamily);
List<Tuple<int, int>> ranges = new List<Tuple<int, int>>
{
new Tuple<int, int>(32, 126), //Latin-1
new Tuple<int, int>(160, 255), //Latin-1 Supplement
new Tuple<int, int>(256, 383), //Latin Extended-A
new Tuple<int, int>(384, 591), //Latin Extended-B
};
foreach (Tuple<int, int> range in ranges)
{
for (int i = range.Item1; i <= range.Item2; i++)
{
if (!glyph.CharacterToGlyphMap.ContainsKey(i)) return false;
}
}
return true;
}
をが、以下は、ラテン語のグリフをサポートするフォントプラス国際通貨文字のサブセットを提供します::何かはしかしで実験し
List<Tuple<int, int>> ranges = new List<Tuple<int, int>>
{
new Tuple<int, int>(32, 126), //Latin-1
new Tuple<int, int>(0x20A0, 0x20B5), //Currency Symbols (Partial)
};
アップデートを3
あなたの質問には、Windows 7で動作するバージョンがあります。Windows 7の非表示フォント機能(@Rick Sladkeyで指摘されているように)を活用しています。デフォルトでは、現在のユーザーのロケール設定に役立つことが理想です。また、シンボルフォントを除外します:
[Test]
public void test()
{
var allFonts = Fonts.SystemFontFamilies.OrderBy(x => x.Source);
var filteredFonts = allFonts.Where(f =>
IsComposite(f) || (!IsSymbol(f) && !IsHidden(f)));
filteredFonts.ToList().ForEach(Console.WriteLine);
}
private static bool IsComposite(FontFamily fontFamily)
{
return fontFamily.Source.StartsWith("Global");
}
private static bool IsSymbol(FontFamily fontFamily)
{
Typeface typeface = fontFamily.GetTypefaces().First();
GlyphTypeface glyph;
typeface.TryGetGlyphTypeface(out glyph);
return glyph.Symbol;
}
private static bool IsHidden(FontFamily fontFamily)
{
const string Key = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Font Management";
const string Value = "Inactive Fonts";
RegistryKey key = Registry.CurrentUser.OpenSubKey(Key);
IEnumerable<string> hiddenFonts = (string[])key.GetValue(Value);
return hiddenFonts.Contains(fontFamily.Source);
}
フィルタリングは 'CollectionViewSource'の' Filter'イベントを行うことができますが、私はあなたがそれを知っていたと思います。私はFontFamilyがSymbolなどであるかどうかを知る方法を見たことがありません。あなたが何を思いつくのが面白いか –
あなたはそれが*ロット*をより困難にするか、それはちょっとした不便さに過ぎないと確信していますか? "非ローマン"フォントを削除しても、まだ多くのフォントが存在します。面白い質問:+1。 –
フォントがサポートしているスクリプトは、関連するフォントクラスでは使用できません。これは埋め込みフォントメタデータを介して一貫して利用できると確信しています。MSはWindows 7の既知のフォントのフォント解析を実行してフォントメタデータのDBを作成しただけではありませんか? –