金牌会员
 
- 积分
- 1974
- 金钱
- 1974
- 注册时间
- 2014-6-27
- 在线时间
- 1035 小时
|
使用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编码。
|
|