使用emWin和朝鲜语字体时显示错误的字形

时间:2014-09-23 00:00:46

标签: c unicode utf-8 fonts embedded

我在嵌入式系统上使用SEGGER emWin

我已下载韩文字体:Korean True Type Font 并将字体转换为C语言数据语句。

当我打印文本时:한국어(“韩文”),没有打印出来。 文本的十六进制代码(UTF-8)是:\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4

我在Font Creator中打开了字体,发现偏移0xED处的字形与文本中的第一个字形不匹配。此外,偏移0xED950x95ED没有字形。

我使用16位Unicode转换文件。

文本的十六进制代码是使用谷歌翻译确定的,然后将文本复制到记事本中,将文本保存为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

1 个答案:

答案 0 :(得分:1)

emWin正常运行 系统设置为UTF-8编码。

问题是找到一个truetype unicode字体,其中包含韩语的所有字形(位图)。许多字体声称支持韩语,但它们的字形位于unicode的错误位置。