2008-08-09

透過 FontFamily.GetName 取得特定語系的字型名稱

一個簡單的列舉就可以找出系統內字型的特定語系名稱:

foreach (FontFamily f in FontFamily.Families)
{
    Console.WriteLine(f.GetName(0) + ":" + f.GetName(0x409));
}

在尋找答案的過程, 意外的多學了幾個關於 LanguageID 的小知識, 原來 language ID 是一個 16 bit 的值, 由兩個部分組成, primary language ID 和 secondary language ID, 結構示意圖如下:

image

其中 Sublanguage ID 僅佔了 6 bits, 一閞始困為沒注意到所以導致計算的結果有誤, 後來仔細看才發現原來兩部份的長度是不同的, 舉個實例來說明一下:

//  winnt.h
//
//  Primary language IDs.
#define LANG_CHINESE                     0x04
//
//  Sublanguage IDs.
#define SUBLANG_CHINESE_TRADITIONAL      0x01    // Chinese (Taiwan)

所以 Traditional Chinese 的 language ID 就等於 0x01 << 10 | 0x04 = 0x404

再繼續往下讀 winnt.h, 又出現了一個叫 locale ID 的東西, 順便也記一下!
image 
keywords: font, LanguageID, localeID

沒有留言: