2013-02-05 8 views
14

Po prostu ciekawy, czy nazwy czcionek w systemie Windows mają zawsze angielskie nazwy twarzy, czy można je zlokalizować w zależności od wybranego języka interfejsu użytkownika?Czy nazwy czcionek są wyświetlane tylko w systemie Windows?

Innymi słowy, czy Times New Roman nazywa to również w chińskiej instalacji systemu Windows?

+2

Niektóre przykłady zlokalizowanych nazw czcionek można znaleźć tutaj: http://www.trigeminal.com/samples/font_choices.html –

Odpowiedz

9

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 
+0

Każda próbka dla C++, a zwłaszcza dla 'CreateFontIndirect'? – ahmd0

+0

Bardzo doceniane ... Chociaż prawdopodobnie powinieneś wypuścić to 'hdcAll', które znajdziesz w' TestEnumFontFamiliesEx', aby zapobiec wyciekom pamięci. – ahmd0