我在嵌入式系统上使用SEGGER emWin
。使用emWin和韩文字体时显示错误的字形
我已经下载了韩文字体:Korean True Type Font 并将字体转换为C语言数据语句。
当我打印文本:한국어(“韩国”)时,没有打印出来。 文本(UTF-8)的十六进制代码是:\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4
我在字体创建者打开了字体,并注意到字形在偏移0xED
不匹配在文本中的第一个字形。另外,在偏移量0xED95
或0x95ED
处没有字形。
我使用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
UTF-8是可变长度的。在这种情况下,三字节序列0xED,0x95,0x9C表示字符U + D55C Hangul Syllable han'한'。建议发布一些代码以显示您如何尝试打印。你在调用'GUI_UC_SetEncodeUTF8'吗? – bobince 2014-09-23 11:49:17
@bobince:我已经添加了代码。是否有从UTF8切换回来的功能? – 2014-09-23 15:48:20
'GUI_UC_SetEncodeNone'看起来像一个反函数,但我希望你通常希望保持UTF-8。当然'Português'和'Français'是UTF-8。 ('Espa \ 303 \ 361ol'不是有效的UTF-8,但是,所以不知道那是什么。) – bobince 2014-09-23 17:21:50