只是好奇,在Windows上的字体名称总是有英文名字,或者是根据用户select的UI语言本地化?
换句话说, Times New Roman
称呼中文安装Windows的?
如果字体创建者选择发布特定语言环境的元数据,但字体名称是本地化的,但是所有字体都有一个系统已知的名称,通常是PostScript名称,确保可以以合理的可靠性引用和检索相同的字体。
对于OpenType和TrueType字体,您可以在OpenType文件的name
记录中找到本地化的名称。
命名表(OpenType Spec 1.6)@ Microsoft排版
字体名称表(TrueType规格)@苹果
对于PostScript Type 1字体,可以通过FontName声明来查找指定的名称。
Adobe的Adobe Type 1字体格式(Adobe)(PDF)
更新:
我检查是否PostScript名称可以用来实例化一个字体,不幸的是它不起作用。 但是,使用本地化名称(从他的评论中从Mark Ransom的链接检索)确实有效。 此示例是在C#中。
using System.Drawing; namespace FontNameCheckApplication { class Program { [STAThread] static void Main(string[] args) { Font TimesNewRomanByPSName = new Font("TimesNewRomanPSMT", 16f); Console.WriteLine("TimesNewRomanPSMT = {0}", TimesNewRomanByPSName.Name); Font TimesNewRomanByName = new Font("Times New Roman", 16f); Console.WriteLine("Times New Roman = {0}", TimesNewRomanByName.Name); Font ArialByPSName = new Font("ArialMT", 16f); Console.WriteLine("ArialMT = {0}", ArialByPSName.Name); Font ArialByName = new Font("Arial", 16f); Console.WriteLine("Arial = {0}", ArialByName.Name); Font GulimByEnglishName = new Font("Gulim", 16f); Console.WriteLine("Gulim = {0}", GulimByEnglishName.Name); Font GulimByKoreanName = new Font("굴림", 16f); Console.WriteLine("굴림 = {0}", GulimByKoreanName.Name); Console.ReadKey(); } } }
不幸的是我们用Font取代了头,因为“Microsoft Sans Serif”绝对不是Times New Roman,也不是Arial。 这表明PostScript名称不能可靠地用于引用相同的字体。
这是输出:
TimesNewRomanPSMT = Microsoft Sans Serif Times New Roman = Times New Roman ArialMT = Microsoft Sans Serif Arial = Arial Gulim = Gulim ?? = Gulim
更新#2:
这里是一个Win32的例子。
有一点要注意的是, CreateFontIndirect()
是受替代。 运行这个示例时,我从来没有得到一个空的句柄,即使是PostScript的名字。 要查看我们是否可以获得未被匹配的匹配,我们应该使用EnumFontFamiliesEx()
来扫描可用的系统字体列表。 我们得到了与C#相同的结果,但没有替换。 对于某些字体,结果可能取决于图形模式设置(请参阅SetGraphicsMode()
/ GM_ADVANCED)。
LOGFONT结构(Windows)@ MSDN
CreateFontIndirect函数(Windows)@ MSDN
SetGraphicsMode函数(Windows)@ MSDN
EnumFontFamiliesEx函数(Windows)@ MSDN
EnumFontFamExProc回调函数(Windows)@ MSDN
#include "stdafx.h" #include <Windows.h> void TestCreateFont(LPCTSTR lpczFontName, BYTE bCharSet) { LOGFONT lf; lf.lfHeight = 0; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_DONTCARE; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE; lf.lfCharSet = bCharSet; lf.lfOutPrecision = OUT_OUTLINE_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH; // NOTE: LF_FACESIZE = 32, WinGdi.h _tcsncpy_s(lf.lfFaceName, 32, lpczFontName, _tcsnlen(lpczFontName, 32)); HFONT hf = ::CreateFontIndirect(&lf); // NOTE: LF_FACESIZE = 32, WinGdi.h _tprintf_s(_T("TestCreateFont:\r\n%.32s = %.32s, bCharSet=%d, HFONT=0x%8.8x\r\n\r\n"), lpczFontName, lf.lfFaceName, bCharSet, hf); ::DeleteObject(hf); } int CALLBACK MyEnumFontFamExProc(const LOGFONT *lpelfe, const TEXTMETRIC *lpntme, DWORD FontType, LPARAM lParam) { _tprintf_s(_T(" Found: %.32s, bCharSet=%d\r\n"), lpelfe->lfFaceName, lpelfe->lfCharSet); return 1; } void TestEnumFontFamiliesEx(LPCTSTR lpczFontName, BYTE bCharSet) { LOGFONT lf; lf.lfHeight = 0; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_DONTCARE; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE; lf.lfCharSet = bCharSet; lf.lfOutPrecision = OUT_OUTLINE_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH; // NOTE: DEFAULT_PITCH = 0, WinGdi.h // NOTE: LF_FACESIZE = 32, WinGdi.h _tcsncpy_s(lf.lfFaceName, 32, lpczFontName, _tcsnlen(lpczFontName, 32)); _tprintf_s(_T("TestEnumFontFamiliesEx: %.32s, bCharSet=%d\r\n"), lpczFontName, bCharSet); HDC hdcAll = GetDC(NULL); ::EnumFontFamiliesEx(hdcAll, &lf, &MyEnumFontFamExProc, 0, 0); } int _tmain(int argc, _TCHAR* argv[]) { TestCreateFont(_T("TimesNewRomanPSMT"), DEFAULT_CHARSET); TestCreateFont(_T("Times New Roman"), DEFAULT_CHARSET); TestCreateFont(_T("ArialMT"), DEFAULT_CHARSET); TestCreateFont(_T("Arial"), DEFAULT_CHARSET); TestCreateFont(_T("Gulim"), DEFAULT_CHARSET); TestCreateFont(_T("굴림"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("TimesNewRomanPSMT"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("Times New Roman"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("ArialMT"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("Arial"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("Gulim"), DEFAULT_CHARSET); TestEnumFontFamiliesEx(_T("굴림"), DEFAULT_CHARSET); return 0; }
结果如下:
TestCreateFont: TimesNewRomanPSMT = TimesNewRomanPSMT, bCharSet=1, HFONT=0xda0a117c TestCreateFont: Times New Roman = Times New Roman, bCharSet=1, HFONT=0xdb0a117c TestCreateFont: ArialMT = ArialMT, bCharSet=1, HFONT=0xdc0a117c TestCreateFont: Arial = Arial, bCharSet=1, HFONT=0xdd0a117c TestCreateFont: Gulim = Gulim, bCharSet=1, HFONT=0xde0a117c TestCreateFont: ?? = ??, bCharSet=1, HFONT=0xdf0a117c TestEnumFontFamiliesEx: TimesNewRomanPSMT, bCharSet=1 TestEnumFontFamiliesEx: Times New Roman, bCharSet=1 Found: Times New Roman, bCharSet=0 Found: Times New Roman, bCharSet=177 Found: Times New Roman, bCharSet=178 Found: Times New Roman, bCharSet=161 Found: Times New Roman, bCharSet=162 Found: Times New Roman, bCharSet=186 Found: Times New Roman, bCharSet=238 Found: Times New Roman, bCharSet=204 Found: Times New Roman, bCharSet=163 Found: Times New Roman, bCharSet=0 Found: Times New Roman, bCharSet=177 Found: Times New Roman, bCharSet=161 Found: Times New Roman, bCharSet=162 Found: Times New Roman, bCharSet=186 Found: Times New Roman, bCharSet=238 Found: Times New Roman, bCharSet=204 Found: Times New Roman, bCharSet=163 Found: Times New Roman, bCharSet=0 Found: Times New Roman, bCharSet=177 Found: Times New Roman, bCharSet=178 Found: Times New Roman, bCharSet=161 Found: Times New Roman, bCharSet=162 Found: Times New Roman, bCharSet=186 Found: Times New Roman, bCharSet=238 Found: Times New Roman, bCharSet=204 Found: Times New Roman, bCharSet=163 Found: Times New Roman, bCharSet=0 Found: Times New Roman, bCharSet=177 Found: Times New Roman, bCharSet=161 Found: Times New Roman, bCharSet=162 Found: Times New Roman, bCharSet=186 Found: Times New Roman, bCharSet=238 Found: Times New Roman, bCharSet=204 Found: Times New Roman, bCharSet=163 TestEnumFontFamiliesEx: ArialMT, bCharSet=1 TestEnumFontFamiliesEx: Arial, bCharSet=1 Found: Arial, bCharSet=0 Found: Arial, bCharSet=177 Found: Arial, bCharSet=178 Found: Arial, bCharSet=161 Found: Arial, bCharSet=162 Found: Arial, bCharSet=186 Found: Arial, bCharSet=238 Found: Arial, bCharSet=204 Found: Arial, bCharSet=163 Found: Arial, bCharSet=0 Found: Arial, bCharSet=177 Found: Arial, bCharSet=161 Found: Arial, bCharSet=162 Found: Arial, bCharSet=186 Found: Arial, bCharSet=238 Found: Arial, bCharSet=204 Found: Arial, bCharSet=163 Found: Arial, bCharSet=0 Found: Arial, bCharSet=177 Found: Arial, bCharSet=178 Found: Arial, bCharSet=161 Found: Arial, bCharSet=162 Found: Arial, bCharSet=186 Found: Arial, bCharSet=238 Found: Arial, bCharSet=204 Found: Arial, bCharSet=163 Found: Arial, bCharSet=0 Found: Arial, bCharSet=177 Found: Arial, bCharSet=161 Found: Arial, bCharSet=162 Found: Arial, bCharSet=186 Found: Arial, bCharSet=238 Found: Arial, bCharSet=204 Found: Arial, bCharSet=163 TestEnumFontFamiliesEx: Gulim, bCharSet=1 Found: Gulim, bCharSet=0 Found: Gulim, bCharSet=129 Found: Gulim, bCharSet=161 Found: Gulim, bCharSet=162 Found: Gulim, bCharSet=186 Found: Gulim, bCharSet=238 Found: Gulim, bCharSet=204 TestEnumFontFamiliesEx: ??, bCharSet=1 Found: Gulim, bCharSet=0 Found: Gulim, bCharSet=129 Found: Gulim, bCharSet=161 Found: Gulim, bCharSet=162 Found: Gulim, bCharSet=186 Found: Gulim, bCharSet=238 Found: Gulim, bCharSet=204
这里有一个来自wingdi.h
关于CharSet值的片段。
#define ANSI_CHARSET 0 #define DEFAULT_CHARSET 1 #define SYMBOL_CHARSET 2 #define SHIFTJIS_CHARSET 128 #define HANGEUL_CHARSET 129 #define HANGUL_CHARSET 129 #define GB2312_CHARSET 134 #define CHINESEBIG5_CHARSET 136 #define OEM_CHARSET 255 #define JOHAB_CHARSET 130 #define HEBREW_CHARSET 177 #define ARABIC_CHARSET 178 #define GREEK_CHARSET 161 #define TURKISH_CHARSET 162 #define VIETNAMESE_CHARSET 163 #define THAI_CHARSET 222 #define EASTEUROPE_CHARSET 238 #define RUSSIAN_CHARSET 204 #define MAC_CHARSET 77 #define BALTIC_CHARSET 186