Are font names on Windows English-only? Are font names on Windows English-only? windows windows

Are font names on Windows English-only?


Font names are localized if the font creator chooses to publish metadata for a specific locale, but all fonts have a system-known name, usually the PostScript name, that ensures that the same font can be referenced and retrieved with a reasonable amount of reliability.

For OpenType and TrueType fonts, you can find localized names in the name record of an OpenType file.

The Naming Table (OpenType Spec 1.6) @ Microsoft Typography
Font Names Table (TrueType Spec) @ Apple

For PostScript Type 1 fonts, you can locate the assigned names by their FontName declarations.

Adobe Type 1 Font Format @ Adobe (PDF)

Update:

I checked to see whether the PostScript name can be used to instantiate a font, and unfortunately it doesn't work. However, using the localized name (as retrieved from Mark Ransom's link in his comment) does work. This sample is in 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();        }    }}

Unfortunately we've butted heads with Font substitution, as "Microsoft Sans Serif" is definitely not Times New Roman nor Arial. This indicates that the PostScript name can't be used reliably to reference the same font.

Here's the output:

TimesNewRomanPSMT = Microsoft Sans SerifTimes New Roman = Times New RomanArialMT = Microsoft Sans SerifArial = ArialGulim = Gulim?? = Gulim

Update #2:

Here's a sample for Win32.

One thing to note is that CreateFontIndirect() is subject to substitution. When running this sample, I never got an empty handle, even for PostScript names. To see whether we can get an unsubstituted match, we should use EnumFontFamiliesEx() to scan the available system font list. We get the same results as the C#, but without substitutions. For some fonts the results may depending on the graphics mode setting (see 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;}

And here are the results:

TestCreateFont:TimesNewRomanPSMT = TimesNewRomanPSMT, bCharSet=1, HFONT=0xda0a117cTestCreateFont:Times New Roman = Times New Roman, bCharSet=1, HFONT=0xdb0a117cTestCreateFont:ArialMT = ArialMT, bCharSet=1, HFONT=0xdc0a117cTestCreateFont:Arial = Arial, bCharSet=1, HFONT=0xdd0a117cTestCreateFont:Gulim = Gulim, bCharSet=1, HFONT=0xde0a117cTestCreateFont:?? = ??, bCharSet=1, HFONT=0xdf0a117cTestEnumFontFamiliesEx: TimesNewRomanPSMT, bCharSet=1TestEnumFontFamiliesEx: 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=163TestEnumFontFamiliesEx: ArialMT, bCharSet=1TestEnumFontFamiliesEx: 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=163TestEnumFontFamiliesEx: 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=204TestEnumFontFamiliesEx: ??, 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

Here's a snippet from wingdi.h for the CharSet values.

#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