unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题
来源:互联网 发布:java多线程 菜鸟教程 编辑:程序博客网 时间:2024/05/16 15:06
之前一直使用的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接口就行了.
- unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题
- FATFS外置UNICODE GBK双向转换码表
- 解决json_encode中文UNICODE转码问题
- 解决json_encode中文UNICODE转码问题
- PHP 中文 转UNICODE, JS 将UNICODE转为GBK
- unicode码表(转)
- unicode转gbk,gbk转unicode CC++
- 中文 转 unicode 问题
- UNICODE GBK双向转换码表
- GBK转unicode
- 中文Unicode编码表
- unicode码表 及 unicode转utf8规则
- unicode码表 及 unicode转utf8规则
- unicode码表 及 unicode转utf8规则
- 中文编码问题(Unicode UTF-8 GBK ...)
- 中文编码问题(Unicode UTF-8 GBK ...) .
- Unicode汉字编码表-转
- php 解决json_encode中文UNICODE转码问题
- gcc常见的选项
- 一个像素表格边框的制作方法
- 浅谈产品竞争分析的方法
- eclipse安卓开发遇到The connection to adb is down, and a severe error has occured。解决办法
- WPF样式(Style)与模板(Template)
- unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题
- 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息
- PowerDesigner 12设置主键自增
- Oracle Experts
- $_SERVER['PHP_SELF']和$_SERVER['SCRIPT_NAME']区别
- Trim
- Win 7 下如何添加硬件
- 套接字和协议的关系
- appWidget学习