OpenEdv-开源电子网

 找回密码
 立即注册
查看: 5094|回复: 0
打印 上一主题 下一主题

使用LVGL的工程,GBK,UTF8,UNICODE相互转换分享

[复制链接]

10

主题

562

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1974
金钱
1974
注册时间
2014-6-27
在线时间
1035 小时
跳转到指定楼层
楼主
发表于 2024-4-18 10:47:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用LVGL的工程,编译器编码方式为UTF8,内部事件存储和LOG打印,使用GBK,FATFS操作使用UNICODE,工程使用GBK<-->UFT8<-->UNICODE模式转换,可以实现所有需要显示的功能了。GBK<-->UFT8的转换,需要用到2个表格,大概80多K,UFT8<-->UNICODE,在FATFS里面,把FF_CODE_PAGE的设置936改成437,不使用936表格,节省近200K的空间。
FATFS里面的配置,参照:https://www.bilibili.com/read/cv16622381/
GBK<-->UFT8的转换,参照压缩包使用。 UTF8_GBK.rar (90.53 KB, 下载次数: 52)
最后封装成3个函数,即可完成转换:
typedef enum
{
    encode_UTF_8 = 0 ,   
    encode_GBK,
    encode_NULL,
};

u8* usbStrSwapToUtf_8OrGbk(u8* dst,const char *src,u8 mode)//GBK<-->UFT8的转换
{
        u32 len;
        if(mode==encode_GBK)
        {
                swapUF_8ToGbk(src,strlen(src),dst,&len);
        }
        else
        {
                    swapGbkToUtf_8(src,strlen(src),dst,&len);
                    
        }
        dst[len]='\0';
        return dst;
}
//以下2个函数是UFT8<-->UNICODE的转换,FATFS里面配置完成后,调用这2个函数就可以了。
#undef _ DF1S
#define _DF1S            0x81

int unicode_to_utf8(char *dest, const WCHAR *src, uint16_t bufflen)
{
    int i = 0;
    WCHAR chr;

    while(*src != '\0')
    {
        chr=*src++;
        if(chr < _DF1S) {
            if(i + 1 > bufflen - 2) {
                return -1;
            }
            dest[i++] = chr;
            continue;
        }

        if(i + 3 > bufflen - 2) {
            return -2;
        }
        dest[i++] = ((chr >> 12) & 0x0F) | 0xE0;
        dest[i++] = ((chr >> 6) & 0x3F) | 0x80;
        dest[i++] = ((chr >> 0) & 0x3F) | 0x80;
    }
    dest = '\0';

    return 0;
}

int utf8_to_unicode(WCHAR *dest, const char *src, uint16_t bufflen)
{
    int i = 0;
    char b1, b2, b3; //b1 表示UTF-8编码的高字节, b2 表示次高字节, ...

    while(*src != '\0')
    {
        if(*src < _DF1S)
            {
            if(i + 1 > bufflen - 2) {
                return -1;
            }
            dest[i++] = *src++;
            continue;
        }
        b1 = src[0];
        b2 = src[1];
        b3 = src[2];
        if (((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) ) {
            return -1;
        }
        if(i + 2 > bufflen - 2) {
            return -2;
        }
        dest[i++]=(((b2 << 6) + (b3 & 0x3F))&0xFF) + ((((b1 << 4) + ((b2 >> 2) & 0x0F))&0xFF)<<8);

        src+=3;
    }
    dest = '\0';
    return 0;
}
//工程FATFS操作U盘,编码转换实例

sprintf(str,"0:%s/火警记录-备份%04d-%02d-%02d.txt",dirName,gV_Rtc.timeCur.year,gV_Rtc.timeCur.mon,gV_Rtc.timeCur.date);
                          utf8_to_unicode(path,str, sizeof(path)); //路径转换成UNICODE后,打开文件
                            if (FR_OK == f_open(&file, path,FA_OPEN_APPEND|FA_CREATE_ALWAYS|FA_WRITE))
                            {
                                      usbUsrHandle.res[3]=3;
                                      usbStrSwapToUtf_8OrGbk(tmpBuf,str, encode_GBK); //LOG打印,转换成GBK后打印
                                        printf("\r\nHint: create file %s success.\r\n",tmpBuf+2);
                                
                                            sprintf(str,"--      火警记录,数量: %d      --\r\n",gvRomInfo.info.evNum[evTyp_Alarm].v.total);
                                      usbStrSwapToUtf_8OrGbk(tmpBuf,str, encode_GBK);
                                        printf("\r\nHint: %s\r\n",tmpBuf);//LOG打印,转换成GBK后打印
                                
                                      utf8_to_unicode(tmpBuf,str, sizeof(tmpBuf)); //数据写入文件,转换成UNICODE后写入
                                            f_printf(&file,tmpBuf);
                              i=0;
                                            if(gvRomInfo.info.evNum[evTyp_Alarm].v.total)
                                            {
                                while(i<gvRomInfo.info.evNum[evTyp_Alarm].v.total)
                                                                {
                                                                       sysAppRdBufForRom(evTyp_Alarm,&devInfo,i++,1);

                                                                       j=sizeof(devInfo.u.pos);
                                                                       ramMemCpy(str,devInfo.u.pos,j);str[j]=0;
                                                                       usbStrSwapToUtf_8OrGbk(tmpBuf,str,encode_UTF_8);
                                                                       ramMemCpy(str,tmpBuf,sizeof(str));
                                                                       sprintf(tmpBuf,"%04d:%s %s %02d机%02d区%03d号 %04d年%02d月%02d日 %02d时%02d分 位置:%s\r\n",i,getEvTypTitleStr(devInfo.u.dot.u.evTyp),Dev_Type_Tab[devInfo.u.dot.u.devTyp],devInfo.u.dot.u.hostId,devInfo.u.dot.zone.zoneId,devInfo.u.dot.u.devId, \
                                                                        devInfo.u.dot.u.year+2000,devInfo.u.dot.u.mon,devInfo.u.dot.u.date,devInfo.u.dot.u.hour,devInfo.u.dot.u.min,str);
                                                                       utf8_to_unicode(tmpBuf1,tmpBuf, sizeof(tmpBuf1));
                                                                         f_printf(&file,tmpBuf1);
                                                                       
                                                                    
                                                                      #if 0
                                                                       usbStrSwapToUtf_8OrGbk(tmpBuf1,tmpBuf,encode_GBK);
                                                                       printf("Hint: %s",tmpBuf1);
                                                                      #endif
                                                                      usb_mdelay(0);
                                                                    
                                                                     usbUsrHandle.num[3]++;
                                                                     if((usbUsrHandle.num[3]%10)==0)
                                                                     usbDealInfoHintDisp(usbUsrHandle.res,usbUsrHandle.num,1);
                                                                }
                                            }
                                            else
                                            {
                                                      sprintf(str,"--没有事件记录--\r\n");
                                                      usbStrSwapToUtf_8OrGbk(tmpBuf,str, encode_GBK);
                                                printf("\r\nHint: %s\r\n",tmpBuf);
                                                
                                                            utf8_to_unicode(tmpBuf,str, sizeof(tmpBuf));
                                                    f_printf(&file,tmpBuf);

                                                      
                                            }
                                            
                                            printf("\r\nHint: --end of file--\r\n");
                                            utf8_to_unicode(tmpBuf,"--end of file--", sizeof(tmpBuf));
                                            f_printf(&file,tmpBuf);   
                                            /* close file and file system */
                                            f_close(&file);
                                            
                                            usbUsrHandle.res[3]=4;
                                      usbDealInfoHintDisp(usbUsrHandle.res,usbUsrHandle.num,1);
                                            

                            }
                            else
                            {
                                
                                 
                                  usbStrSwapToUtf_8OrGbk(tmpBuf,str, encode_GBK);
                                    printf("\r\nHint: create file %s fail.\r\n",tmpBuf+2);
                                 
                                  usbUsrHandle.res[3]=1;
                                  usbDealInfoHintDisp(usbUsrHandle.res,usbUsrHandle.num,1);
                                
                            }

LVGL的U盘备份


U盘文件夹文件


U盘文件内容,UNICODE编码


LOG打印,GBK编码


有从U盘到主机更新数据的情况,如果电脑不是UNICOE编码,可以先备份文件,备份文件即为UNICODE编码,再用备份文件修改内容更新到主机,更新的即为UNICODE编码。


回复

使用道具 举报

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

本版积分规则

关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-3-15 10:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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