Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are font names on Windows English-only?

Just curious, do font names on Windows always have English face names, or are they localizable depending on a user selected UI language?

In other words, is Times New Roman called that as well on Chinese installation of Windows?

like image 541
ahmd0 Avatar asked Feb 05 '13 22:02

ahmd0


People also ask

What type of fonts does Windows use?

Segoe UI (pronounced "SEE-go") is the Windows system font. The standard font size has been increased to 9 point.

How are fonts named?

The standard weight of a font can be referred to as Regular, Normal, Plain or Roman. Lighter and heavier styles are often named Light, Medium, Bold or Black. But sometimes, font weights (and widths) are specified by numerical designators.

Are Windows fonts copyrighted?

Generally, copyright law in the U.S. does not protect typefaces. Fonts may be protected as long as the font qualifies as computer software or a program (and in fact, most fonts are programs or software).

What is the font used by Windows 10?

Windows 10's default system font, Segoe UI, looks pretty nice. However, if you have something better to replace it with, you can change the default system font on your Windows 10 PC.

Are Windows fonts TTF?

TrueType is a digital font technology designed by Apple Computer, and now used by both Apple and Microsoft in their operating systems.

What is font name in computer?

The word font refers to a set of printable or displayable typography or text characters in a specific style and size. Font styles are used in both print and digital text.


1 Answers

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 Serif
Times New Roman = Times New Roman
ArialMT = Microsoft Sans Serif
Arial = Arial
Gulim = 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=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

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
like image 172
meklarian Avatar answered Sep 20 '22 11:09

meklarian