임베디드 시스템에서 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
UTF-8은 가변 길이입니다. 이 경우 3 바이트 시퀀스 0xED, 0x95,0x9C는 U + D55C 한글 음절 한 문자를 나타냅니다. 인쇄 방법을 보여주는 코드를 게시하십시오. 'GUI_UC_SetEncodeUTF8'을 (를) 호출하고 있습니까? – bobince
@bobince : 코드를 추가했습니다. UTF8에서 다시 전환 할 수있는 기능이 있습니까? –
'GUI_UC_SetEncodeNone'은 역함수처럼 보이지만 일반적으로 UTF-8로 머무르고 싶을 것입니다. 확실히'Português'와'Français'는 UTF-8에 있습니다. ('Espa \ 303 \ 361ol'은 유효한 UTF-8이 아니기 때문에 그것이 무엇인지는 알 수 없습니다.) – bobince