2013-02-05 3 views
14

Windows에서 글꼴 이름은 항상 영어 얼굴 이름을 사용합니까? 아니면 사용자가 선택한 UI 언어에 따라 지역화 할 수 있습니까?Windows의 글꼴 이름은 영어로만 제공됩니까?

즉, Times New Roman은 중국어 설치 Windows에서도 마찬가지입니까?

+2

몇 가지 예는 여기에서 찾을 수 있습니다 : http://www.trigeminal.com/samples/font_choices.html –

답변

9

글꼴 작성자가 특정 로캘의 메타 데이터를 게시하도록 선택했지만 모든 글꼴에 시스템 인식 이름 (일반적으로 PostScript 이름)이 있으면 같은 글꼴을 참조 할 수 있고 합리적인 방식으로 검색 할 수 있도록 글꼴 이름이 지역화됩니다 신뢰성의 정도.

OpenType 및 TrueType 글꼴의 경우 OpenType 파일의 name 레코드에서 현지화 된 이름을 찾을 수 있습니다. 포스트 스크립트 타입 1 글꼴 Font Names Table (TrueType Spec) @ Apple

The Naming Table (OpenType Spec 1.6) @ Microsoft Typography

, 당신은 자신의 글꼴 이름 선언에 의해 할당 된 이름을 찾을 수 있습니다.

Adobe Type 1 Font Format @ Adobe (PDF)

업데이트 : 포스트 스크립트 이름이 글꼴을 인스턴스화하는 데 사용 될 수 있으며, 불행하게도 그것이 작동하지 않습니다 있는지 여부를 확인

. 그러나 현지화 된 이름을 사용하면 (주석에서 Mark Ransom의 링크에서 검색 한 것처럼) 작동합니다. 이 샘플은 C#에 있습니다. "마이크로 소프트 Sans 고딕"등의 폰트 대체와

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(); 
     } 
    } 
} 

불행하게도 우리는 버 티드 한 머리는 확실히 굴림이나 굴림 없습니다. 이것은 PostScript 이름을 동일한 글꼴을 참조하는 데 사용할 수 없음을 나타냅니다.

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

업데이트 # 2 :

여기에서 Win32에 대한 샘플의

여기에 출력합니다.

주목할 점은 CreateFontIndirect()은 대체 대상입니다. 이 샘플을 실행할 때 PostScript 이름의 경우에도 빈 핸들을 얻지 못했습니다. 치환되지 않은 일치 여부를 확인하려면 EnumFontFamiliesEx()을 사용하여 사용 가능한 시스템 글꼴 목록을 검사해야합니다. 우리는 C#과 동일한 결과를 얻지 만 대체하지는 않습니다. 일부 글꼴의 경우 결과는 그래픽 모드 설정에 따라 달라질 수 있습니다 (SetGraphicsMode()/GM_ADVANCED 참조). 여기에 조각이에서의

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 

:

LOGFONT structure (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; 
} 

그리고 CreateFontIndirect function (Windows) @ MSDN
SetGraphicsMode function (Windows) @ MSDN
결과입니다 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

C에 대한 ++, 특히'CreateFontIndirect'에 대한 모든 샘플? – ahmd0

+0

많이 감사드립니다 ... 아마도'hdcAll'을 릴리즈해야하지만,'TestEnumFontFamiliesEx'에서 메모리 누출을 막을 수 있습니다. – ahmd0

관련 문제