Nazwy czcionek są zlokalizowane, jeśli twórca czcionek zdecyduje się opublikować metadane dla określonych ustawień narodowych, ale wszystkie czcionki mają znaną systemową nazwę, zazwyczaj nazwę PostScript, która zapewnia, że tę samą czcionkę można przywołać i pobrać z ilość niezawodności.
W przypadku czcionek OpenType i TrueType można znaleźć zlokalizowane nazwy w pliku name
pliku OpenType.
The Naming Table (OpenType Spec 1.6) @ Microsoft Typography
Font Names Table (TrueType Spec) @ Apple
Dla czcionek PostScript Type 1, można zlokalizować nazwy przypisane przez swoich deklaracjach fontName.
Adobe Type 1 Font Format @ Adobe (PDF)
Aktualizacja:
sprawdziłem, czy nazwa PostScript może być używany do tworzenia wystąpień czcionki, i niestety nie działa. Jednak użycie zlokalizowanej nazwy (w wersji pobranej z linku Marka Ransoma w jego komentarzu) działa. Ta próbka jest w języku 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();
}
}
}
Niestety mamy cieniowana głowy z podstawienia czcionki jako "Microsoft Sans Serif" zdecydowanie nie jest Times New Roman, ani Arial. Oznacza to, że nazwa PostScript nie może być używana niezawodnie do odniesienia do tej samej czcionki.
Oto wynik:
TimesNewRomanPSMT = Microsoft Sans Serif
Times New Roman = Times New Roman
ArialMT = Microsoft Sans Serif
Arial = Arial
Gulim = Gulim
?? = Gulim
Aktualizacja # 2:
Oto próbka dla Win32.
Jedna rzecz do zapamiętania to, że CreateFontIndirect()
może ulec zmianie. Podczas uruchamiania tego przykładu nigdy nie dostałem pustego uchwytu, nawet dla nazw PostScript. Aby sprawdzić, czy możemy uzyskać niepodstawiony mecz, powinniśmy użyć EnumFontFamiliesEx()
, aby zeskanować dostępną listę czcionek systemowych. Otrzymujemy takie same wyniki jak C#, ale bez podstawień. W przypadku niektórych czcionek wyniki mogą zależeć od ustawienia trybu graficznego (patrz SetGraphicsMode()
/GM_ADVANCED).
LOGFONT structure (Windows) @ MSDN
CreateFontIndirect function (Windows) @ MSDN
SetGraphicsMode function (Windows) @ MSDN
EnumFontFamiliesEx function (Windows) @ MSDN
EnumFontFamExProc callback function (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;
}
A oto wyniki:
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
Oto urywek z wingdi.h
dla wartości 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
Niektóre przykłady zlokalizowanych nazw czcionek można znaleźć tutaj: http://www.trigeminal.com/samples/font_choices.html –