2014-09-23 22 views
1

임베디드 시스템에서 SEGGER emWin을 사용 중입니다.emWin 및 한국어 글꼴을 사용할 때 잘못된 글리프가 표시됨

한국어 글꼴을 다운로드했습니다 : Korean True Type Font 그리고 C 언어 데이터 구문으로 변환했습니다.

한국어 ("한국어") 텍스트를 인쇄 할 때 아무 것도 인쇄되지 않습니다. 텍스트 (UTF-8)의 16 진수 코드는 다음과 같습니다 \xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4

나는 글꼴 창조주의 글꼴을 열고 문자 모양에서 텍스트의 첫 번째 문자 모양과 일치하지 않는 0xED 오프셋 나타났습니다. 또한 오프셋 0xED95 또는 0x95ED에 글리프가 없습니다.

16 비트 유니 코드를 사용하여 파일을 변환했습니다.

텍스트의 16 진 코드는 Google 번역을 사용하여 텍스트를 메모장에 복사하고 텍스트를 UTF-8로 저장 한 다음 16 진수 편집기로 열어서 결정했습니다.

적절한 글리프를 인쇄하려면 어떻게 16 진수 문자열을 얻습니까?

유니 코드 대 UTF-8 문제가 있습니까?

편집 1 :
는 내가 그 부분에 혼란 스러워요로, 인코딩을 변경하는 어떤 함수를 호출하고 있지 않다. 다음은 필수 코드입니다 :

// alphabetize languages for display 
static const Languages_t Language_map[] = 
{ 
    {"Deutsch", ESG_LANG_German__Deutsch_}, 
    {"English", ESG_LANG_English}, 
    {"Espa\303\361ol", ESG_LANG_Spanish__Espanol_}, 
    {"Fran\303\247ais", ESG_LANG_French__Francais_}, /* parasoft-suppress MISRA2004-7_1 "octal sequence needed for text accents on foreign language text" */ 
    {"Italiano", ESG_LANG_Italian__Italiano_}, 
    {"Nederlands", ESG_LANG_Dutch__Nederlands_}, 
    {"Portugu\303\252s", ESG_LANG_Portuguese__Portugues_}, /* parasoft-suppress MISRA2004-7_1 "octal sequence needed for text accents on foreign language text" */ 
    {"Svenska", ESG_LANG_Swedish__Svenska_}, 
    {"\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4",ESG_LANG_Korean}, // UTF-8 
// {"\xFF\xFE\x5c\xD5\x6D\xAD\xB4\xC5", ESG_LANG_Korean}, // Unicode 
}; 

    for (index = ESG_LANG_English; index < ESG_LANG_MAX_LANG; index++) 
    { 
     if (index == ESG_LANG_Korean) 
     { 
      GUI_SetFont(&Font_KTimesSSK22_12pt); 
     } 
     else 
     { 
     GUI_SetFont(&GUI_FontMyriadPro_Semibold_22pt); 
     } 
     if (index == language) 
     { 
      GUI_SetColor(ESG_WHITE); 
     } 
     else 
     { 
      GUI_SetColor(ESG_AMR_BLUE); 
     } 
     (void) GUI_SetTextAlign(GUI_TA_HCENTER); 
     GUI_DispStringAt(Language_map[index].name, 
      (signed int)Language_position[index].x, 
      (signed int)Language_position[index].y); 
    } 
//... 

    void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y) { 
     GUI_LOCK(); 
     GUI_pContext->DispPosX = x; 
     GUI_pContext->DispPosY = y; 
     GUI_DispString(s); 
     GUI_UNLOCK(); 
    } 

GUI_UNI_PTR은 유니 코드를위한 것이 아니라 "유니버설"에 대한 :

/* Define "universal pointer". Normally, this is not needed (define will expand to nothing) 
    However, on some systems (AVR - IAR compiler) it can be necessary (-> __generic), 
    since a default pointer can access RAM only, not the built-in Flash 
*/ 
#ifndef GUI_UNI_PTR 
    #define GUI_UNI_PTR 
    #define GUI_UNI_PTR_USED 0 
#else 
    #define GUI_UNI_PTR_USED 1 
#endif 
+0

UTF-8은 가변 길이입니다. 이 경우 3 바이트 시퀀스 0xED, 0x95,0x9C는 U + D55C 한글 음절 한 문자를 나타냅니다. 인쇄 방법을 보여주는 코드를 게시하십시오. 'GUI_UC_SetEncodeUTF8'을 (를) 호출하고 있습니까? – bobince

+0

@bobince : 코드를 추가했습니다. UTF8에서 다시 전환 할 수있는 기능이 있습니까? –

+0

'GUI_UC_SetEncodeNone'은 역함수처럼 보이지만 일반적으로 UTF-8로 머무르고 싶을 것입니다. 확실히'Português'와'Français'는 UTF-8에 있습니다. ('Espa \ 303 \ 361ol'은 유효한 UTF-8이 아니기 때문에 그것이 무엇인지는 알 수 없습니다.) – bobince

답변

1

emWin이 제대로 수행하고 있습니다.
시스템이 UTF-8 인코딩으로 설정되었습니다.

문제는 한국어의 모든 글리프 (비트 맵)를 포함하는 truetype 유니 코드 글꼴을 찾는 것입니다. 많은 글꼴이 한국어를 지원한다고 주장하지만, 글립 문자는 유니 코드의 잘못된 위치에 있습니다.

관련 문제