2013-02-05 13 views
14

Solo per curiosità, i nomi dei font su Windows hanno sempre nomi di volti in inglese o sono localizzabili a seconda della lingua dell'interfaccia utente selezionata dall'utente?I nomi dei font sono in inglese solo su Windows?

In altre parole, è Times New Roman chiamato anche nell'installazione cinese di Windows?

+2

Alcuni esempi di nomi di font lingua possono essere trovate qui: http://www.trigeminal.com/samples/font_choices.html –

risposta

9

I nomi dei caratteri sono localizzati se il creatore del carattere sceglie di pubblicare i metadati per un locale specifico, ma tutti i font hanno un nome noto di sistema, di solito il nome PostScript, che garantisce che lo stesso font possa essere referenziato e recuperato con un ragionevole quantità di affidabilità.

Per i caratteri OpenType e TrueType, è possibile trovare nomi localizzati nel record name di un file OpenType.

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

Per font PostScript Type 1, è possibile individuare i nomi assegnati dai loro dichiarazioni FontName.

Adobe Type 1 Font Format @ Adobe (PDF)

Aggiornamento:

ho controllato per vedere se il nome PostScript può essere utilizzato per creare un'istanza di un tipo di carattere, e purtroppo non funziona. Tuttavia, l'utilizzo del nome localizzato (come recuperato dal link di Mark Ransom nel suo commento) funziona. Questo esempio è 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(); 
     } 
    } 
} 

teste Purtroppo abbiamo spessore con la sostituzione dei caratteri, come "Microsoft Sans Serif" non è sicuramente Times New Roman né Arial. Ciò indica che il nome PostScript non può essere utilizzato in modo affidabile per fare riferimento allo stesso carattere.

ecco l'output:

TimesNewRomanPSMT = Microsoft Sans Serif 
Times New Roman = Times New Roman 
ArialMT = Microsoft Sans Serif 
Arial = Arial 
Gulim = Gulim 
?? = Gulim 

Aggiornamento # 2:

Ecco un esempio per Win32.

Una cosa da notare è che CreateFontIndirect() è soggetto a sostituzione. Quando si esegue questo esempio, non ho mai avuto un handle vuoto, anche per i nomi PostScript. Per vedere se possiamo ottenere una corrispondenza non sostituita, dovremmo usare EnumFontFamiliesEx() per scansionare la lista dei caratteri di sistema disponibili. Otteniamo gli stessi risultati del C#, ma senza sostituzioni. Per alcuni tipi di carattere i risultati possono dipendere dall'impostazione della modalità grafica (vedere 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; 
} 

Ed ecco i risultati:

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 

Ecco un frammento da wingdi.h per i valori 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

Ogni campione per C++ e soprattutto per 'CreateFontIndirect'? – ahmd0

+0

Molto apprezzato ... Anche se probabilmente dovresti rilasciare 'hdcAll' in' TestEnumFontFamiliesEx' per evitare perdite di memoria. – ahmd0

Problemi correlati