博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题(转)
阅读量:6326 次
发布时间:2019-06-22

本文共 2701 字,大约阅读时间需要 9 分钟。

源:

  之前一直使用的512KB ROM的STM32,但是最近使用的只有128KB,想用FATFS显示支持长文件名,发现添加CC936.C后ROM肯定不够的,就决定将这个双向码表存储到外部存储器中,flash或者SD卡都行,只有能读就行;

更改后的CC936.C中的编码转换函数

WCHAR ff_convert ( /* Converted code, 0 means conversion error */        WCHAR src, /* Character code to be converted */        UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */    ){    WCHAR c;    if (src < 0x80) {        /* ASCII */        c = src;    }     else     {        if (dir)         { /* OEMCP to unicode */            c = GBKtoUNICODE(src);        }         else         { /* Unicode to OEMCP */             c = UNICODEtoGBK(src);        }    }    return c; }

删掉那两个码表后,代码瞬间减小了几百KB了.

//我使用的是W25X16//存储位置说明//0x00 ~ 0xbc00         存放    UtoG.sys  42kb//0xc000 ~  0x17c00    存放   GtoU.sys   47kb//0x18000 ~  0xd3800存放  12x12.ttf 750kb //0xd3c00 ~  0x18f400 存放  16x16.ttf 750kb//各文件基址#define CODE_UtoG_BASE (0x00)//unicode转GBK码表#define CODE_GtoU_BASE (0xC000)//GBK转unicode码表#define FONT_12X12_BASE (0x18000)//12x12GBK字库#define FONT_16X16_BASE (0xd3c00)//16x16GBK字库

 

下面看这两个函数的实现方式

 

/************************************************************************************************************************* * 函数 :  u16 GBKtoUNICODE(u16 GBKCode) * 功能 :  将GBK编码转换为unicode编码 * 参数 :  GBK  * 返回 :  unicode * 依赖 :  底层读写函数 * 作者 :  陈鹏 * 时间 :  20120602 * 最后修改时间 : 20120602 * 说明 : 需要flash中的码表支持GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe*************************************************************************************************************************/ u16 GBKtoUNICODE(u16 GBKCode){  u16 unicode;  u8 buff[2];  u16 *p;  u8 ch,cl;  ch = GBKCode >> 8;  cl = GBKCode & 0x00ff;  //计算偏移  if(cl < 0x7f)  unicode = (ch-0x81)*190+cl-0x40;  if(cl > 0x80)  unicode = (ch-0x81)*190+cl-0x41;  unicode *= 2;  W25X16_Read(buff,CODE_GtoU_BASE + unicode,2) ; //读取码表  p = (u16 *)buff;  return *p;}/************************************************************************************************************************* * 函数 :  u16 UNICODEtoGBK(u16 unicode) * 功能 :  将unicode编码转换为GBK编码 * 参数 :  unicode * 返回 :  GBK  * 依赖 :  底层读写函数 * 作者 :  陈鹏 * 时间 :  20120602 * 最后修改时间 : 20120602 * 说明 : 需要flash中的码表支持GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe*************************************************************************************************************************/ u16 UNICODEtoGBK(u16 unicode)  //用二分查找算法{  u32 offset;  u8 temp[2];  u16 res;  if(unicode<=0X9FA5) offset=unicode-0X4E00;  else if(unicode>0X9FA5)//是标点符号  {    if(unicode<0XFF01||unicode>0XFF61)return 0;//没有对应编码    offset=unicode-0XFF01+0X9FA6-0X4E00;      }    W25X16_Read(temp,offset*2+CODE_UtoG_BASE,2);//得到GBK码     res=temp[0];  res<<=8;  res+=temp[1];     return res ; //返回找到的编码}

只要根据自己使用的存储器更改W25X16_Read()这个底层IO接口就行了.

转载地址:http://jjgaa.baihongyu.com/

你可能感兴趣的文章
js计算base64文件流大小
查看>>
常用笔记:Web前端
查看>>
各种基金调用介绍
查看>>
PO,VO,BO,DTO,POJO(POCO),DAO的区别(转载)
查看>>
linq中join的用法
查看>>
【CRC校验】学习笔记
查看>>
bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
查看>>
bzoj千题计划323:bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)
查看>>
Linux基础入门
查看>>
Jenkins performance插件生成性能测试报告【待完成】
查看>>
Maven学习总结
查看>>
补第二阶段冲刺站立会议5(原6月7日)
查看>>
Cookie application session
查看>>
MVC最佳实践
查看>>
【集成学习】sklearn中xgboot模块中fit函数参数详解(fit model for train data)
查看>>
【剑指offer】顺时针打印矩阵,C++实现
查看>>
【pandas】pandas.to_datatime()---时间格式转换
查看>>
LINUX 硬链接与软链接的区别
查看>>
Etcd和ZooKeeper,究竟谁在watch的功能表现更好?
查看>>
这个可以用于字库描边曲线处理,比bez简单多了
查看>>