硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1906|回复: 2
收起左侧

[emWin] emwin 字体问题

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2021-9-28 16:19:34 | 显示全部楼层 |阅读模式
emwin  中文键盘输入中文,使用的是UTF8 字体,打印机只支持GB2312  ,这样导致打印的是乱码,请问 字体怎么转换?谢谢
回复

使用道具 举报

8

主题

53

回帖

77

积分

初级会员

积分
77
发表于 2021-9-28 19:30:46 | 显示全部楼层
Utf8------>Unicode------>GBK2312
回复

使用道具 举报

8

主题

53

回帖

77

积分

初级会员

积分
77
发表于 2021-9-28 19:34:11 | 显示全部楼层
Utf8------->Unicode------->GBK2312

具体实现如下:

/*************************************************************************************************
* 将UTF8编码转换成Unicode(UCS-2LE)编码  低地址存低位字节
* 参数:
*    char* pInput   输入字符串
*    char*pOutput   输出字符串
* 返回值:转换后的Unicode字符串的字节数,如果出错则返回-1
**************************************************************************************************/
int Utf8ToUnicode(char* pInput,char* pOutput)
{
        char low,high;       
        char middle;
       
        int outputSize = 0; //记录转换后的Unicode字符串的字节数

        while (*pInput)
        {
               
                if (*pInput > 0x00 && *pInput <= 0x7F){ //处理单字节UTF8字符(英文字母、数字)
               
                        *pOutput = *pInput;
                         pOutput++;
                        *pOutput = 0; //小端法表示,在高地址填补0
                       
                 }else if (((*pInput) & 0xE0) == 0xC0) {//处理双字节UTF8字符
               
                        high = *pInput;
                        pInput++;
                        low = *pInput;
                       
                        if ((low & 0xC0) != 0x80){  //检查是否为合法的UTF8字符表示                       
                                return -1; //如果不是则报错
                        }

                        *pOutput = (high << 6) + (low & 0x3F);
                        pOutput++;
                        *pOutput = (high >> 2) & 0x07;
                       
                }else if (((*pInput) & 0xF0) == 0xE0){ //处理三字节UTF8字符
               
                        high = *pInput;
                        pInput++;
                        middle = *pInput;
                       
                        pInput++;
                       
                        low = *pInput;
                       
                        if (((middle & 0xC0) != 0x80) || ((low & 0xC0) != 0x80)){                       
                                return -1;
                        }
                       
                        *pOutput = (middle << 6) + (low & 0x3F);//取出middle的低两位与low的低6位,组合成unicode字符的低8位
                        pOutput++;
                        *pOutput = (high << 4) + ((middle >> 2) & 0x0F); //取出high的低四位与middle的中间四位,组合成unicode字符的高8位
                       
                }else {   //对于其他字节数的UTF8字符不进行处理               
                        return -1;
                }
               
                pInput ++;//处理下一个utf8字符
                pOutput ++;
                outputSize += 2;
               
        }
       
        //unicode字符串后面,有两个\0
        *pOutput = 0;
         pOutput++;
        *pOutput = 0;
       
        return outputSize;
}


/****************************************************************************       
* 功    能: unicode编码---变换成GBK2312汉字编码
*---------------------------------------------------------------------------*
* 入口参数: buf1-----汉字高位编码;
*            buf2-----汉字低位编码;
* 出口参数: nil
****************************************************************************/       
uint16_t  Unicode_TO_GBK(char *buf)
{
         uint16_t  unicode_val;         
       
         unicode_val=(buf[1]<<8)+ buf[0];       
       
         unicode_val=symbol_convert(unicode_val,0); //变换成OEM
       
         return unicode_val;
       
}






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-21 05:13 , Processed in 0.233636 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表