2014-09-23 176 views
1

我在嵌入式系統上使用SEGGER emWin使用emWin和韓文字體時顯示錯誤的字形

我已經下載了韓文字體:Korean True Type Font 並將字體轉換爲C語言數據語句。

當我打印文本:한국어(「韓國」)時,沒有打印出來。 文本(UTF-8)的十六進制代碼是:\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4

我在字體創建者打開了字體,並注意到字形在偏移0xED不匹配在文本中的第一個字形。另外,在偏移量0xED950x95ED處沒有字形。

我使用16位Unicode轉換文件。

文本的十六進制代碼是使用Google Translate確定的,然後將文本複製到記事本中,將文本保存爲UTF-8,然後用十六進制編輯器打開文本文件。

如何讓十六進制字符串打印適當的字形?

我有Unicode和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不是Unicode的,但對 「環球」:

/* 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是可變長度的。在這種情況下,三字節序列0xED,0x95,0x9C表示字符U + D55C Hangul Syllable han'한'。建議發佈一些代碼以顯示您如何嘗試打印。你在調用'GUI_UC_SetEncodeUTF8'嗎? – bobince 2014-09-23 11:49:17

+0

@bobince:我已經添加了代碼。是否有從UTF8切換回來的功能? – 2014-09-23 15:48:20

+0

'GUI_UC_SetEncodeNone'看起來像一個反函數,但我希望你通常希望保持UTF-8。當然'Português'和'Français'是UTF-8。 ('Espa \ 303 \ 361ol'不是有效的UTF-8,但是,所以不知道那是什麼。) – bobince 2014-09-23 17:21:50

回答

1

的emWin的正確執行。
系統設置爲UTF-8編碼。

問題是找到一個truetype unicode字體,其中包含朝鮮語的所有字形(位圖)。許多字體聲稱支持韓語,但他們的字形在unicode的地方是錯誤的。