unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题(转)
源:unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题
之前一直使用的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[];
u16 *p;
u8 ch,cl; ch = GBKCode >> ;
cl = GBKCode & 0x00ff; //计算偏移
if(cl < 0x7f)
unicode = (ch-0x81)*+cl-0x40;
if(cl > 0x80)
unicode = (ch-0x81)*+cl-0x41;
unicode *= ; W25X16_Read(buff,CODE_GtoU_BASE + unicode,) ; //读取码表 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[];
u16 res;
if(unicode<=0X9FA5) offset=unicode-0X4E00;
else if(unicode>0X9FA5)//是标点符号
{
if(unicode<0XFF01||unicode>0XFF61)return ;//没有对应编码
offset=unicode-0XFF01+0X9FA6-0X4E00;
}
W25X16_Read(temp,offset*+CODE_UtoG_BASE,);//得到GBK码
res=temp[];
res<<=;
res+=temp[];
return res ; //返回找到的编码
}
只要根据自己使用的存储器更改W25X16_Read()这个底层IO接口就行了.
unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题(转)的更多相关文章
- 聊聊计算机中的编码(Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等)以及乱码问题的解决办法
作为一个程序员,一个中国的程序员,想来“乱码”问题基本上都遇到过,也为之头疼过.出现乱码问题的根本原因是编码与解码使用了不同而且不兼容的“标准”,在国内一般出现在中文的编解码过程中. 我们平时常见的编 ...
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)
ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...
- 关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
我们最初学习计算机的时候,都学过ASCII编码. 但是为了表示各种各样的语言,在计算机技术的发展过程中,逐渐出现了很多不同标准的编码格式, 重要的有Unicode.UTF.ISO-8859-1和中国人 ...
- 解决 git 中文路径显示 unicode 代码的问题
解决 git 中文路径显示 unicode 代码的问题 当被修改的文件中带有中文字符时,中文字符会被转换为 unicode 代码,看不出原来的文件名. 这时,只要配置 :: git config -- ...
- unicode和gbk的互相转换
unicode和gbk的互相转换主要依靠window下的escape和unescape方法,然后把%u替换成\u就好了; var GB2312UnicodeConverter = { ToUnicod ...
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
- 小程序实现GBK编码数据转为Unicode/UTF8
首先,不存在一种计算算法将GBK编码转换为Unicode编码,因为这两套编码本身毫无关系. 要想实现两者之间的互转,只能通过查表法实现. 在浏览器中实现编码转换,只需要简单两句: var x = ne ...
- 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...
- 浅谈编码Base64、Hex、UTF-8、Unicode、GBK等
网络上大多精彩的回答,该随笔用作自我总结: 首先计算机只认得二进制,0和1,所以我们现在看到的字都是经过二进制数据编码后的:计算机能针对0和1的组合做很多事情,这些规则都是人定义的:然后有了字节的概念 ...
随机推荐
- World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)
分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代 ...
- 报错:error C2229: class ' ' has an illegal zero-sized array 引发的思考
问题:
- Redis(2)用jedis实现在java中使用redis
昨天已经在windows环境下安装使用了redis. 下面准备在java项目中测试使用redis. redis官网推荐使用jedis来访问redis.所以首先准备了jedis的jar包,以及需要依赖的 ...
- 用telnet命令,POP3接收邮件
昨天已经成功利用telnet命令发送了邮件,今天接着来,只能发送不能接收多郁闷. 邮件的接收这里是基于pop3协议的,pop3协议共定义了12条与接收相关的邮件,如下面简单解释: 首先是与登陆验证相关 ...
- 饥饿的牛(hunger)
饥饿的牛(hunger) 题目描述 牛在饲料槽前排好了队.饲料槽依次用1到n(1≤n≤2000)编号.每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料.约翰提供B个区间的清单.一个区间是一对 ...
- Warning: The Copy Bundle Resources build phase contains this target's Info.plist file 'yintingting_baisi/Info.plist'.
处理方法: The INFOPLIST_FILE build setting specifies the name of the Info.plist associated with your tar ...
- 用批处理文件删除n天前的文件
原文:http://blog.csdn.net/leehq/archive/2007/08/03/1723743.aspx 公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服 ...
- 基于POI的Excel导入导出(JAVA实现)
今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...
- base库插件---form
$().extend('serialize', function () { for (var i = 0; i < this.elements.length; i ++) { var form ...
- achartengine画出动态折线图
achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...