源:FATFS外置UNICODE GBK双向转换码表

将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持,

首先将UtoG.sys,GtoU.sys两个文件放到SD卡根目录,注意,一定要在根目录,并且是短文件名,因为长文件名需要UNICODE支持,此时的FATFS还是不支持长文件名的,但是当初始化UNICODE码表后就可以支持长文件名了.

两个码表下载地址:http://download.csdn.net/detail/cp1300/5526739

附上C代码

/*************************************************************************************************************
* 文件名: unicode_gbk.c
* 功能: 汉字编码转换
* 作者: cp1300@139.com
* 创建时间: 2013-04-03
* 最后修改时间:2013-04-03
* 详细: 需要码表支持
*************************************************************************************************************/
#include "system.h"
#include "unicode_gbk.h" #define GBK_UNICODE_IS_SDCARD 1 //GBK,UNICODE编码表在SD卡或其它存储器中 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//码表在SD卡中
#if GBK_UNICODE_IS_SDCARD #include "ff.h"
#define GtoU "0:/GtoU.sys" //GBK 转 UCICODE 编码表位置
#define UtoG "0:/UtoG.sys" //UCICODE 转 GBK 编码表位置 static FIL GtoU_File; //GtoU 文件工作区
static FIL UtoG_File; //UtoG 文件工作区 /*************************************************************************************************************************
* 函数 : u8 GBK_UNICODE_Init(void)
* 功能 : 初始化GBK,UNICODE编码表
* 参数 : 无
* 返回 : 0:初始化成功;其它:初始化失败
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 2013-04-18
* 最后修改时间 : 2013-04-18
* 说明 : 无
*************************************************************************************************************************/
u8 GBK_UNICODE_Init(void)
{
FRESULT status; status = f_open(&UtoG_File, UtoG, FA_OPEN_EXISTING | FA_READ); //以只读方式打开UNICODEtoGBK码表,打开失败返回错误
if(status != FR_OK) //打开失败
{
uart_printf("open %s error (%d)!\r\n",UtoG, status);
return ;
} status = f_open(&GtoU_File, GtoU, FA_OPEN_EXISTING | FA_READ); //以只读方式打开GBKtoUNICODE码表,打开失败返回错误
if(status != FR_OK) //打开失败
{
uart_printf("open %s error (%d)!\r\n",GtoU, status);
return ;
} return ;
} /*************************************************************************************************************************
* 函数 : u16 OneGBKtoUNICODE(u16 GBKCode)
* 功能 : 将GBK编码转换为unicode编码
* 参数 : GBK
* 返回 : unicode
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 20120602
* 最后修改时间 : 20120602
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneGBKtoUNICODE(u16 GBKCode)
{
u8 ch,cl;
UINT bw;
u16 data; ch = GBKCode >> ;
cl = GBKCode & 0x00ff; ch -= 0x81;
cl -= 0x40; f_lseek(&GtoU_File, (ch*0xbf+cl)*); //文件指针调到偏移位置
if(f_read(&GtoU_File, (u8 *)&data, , &bw) != FR_OK) //读取2字节
{
return 0x1fff;
} return (ch<=0x7d && cl<=0xbe) ? data : 0x1fff; /* ch = GBKCode >> 8;
cl = GBKCode & 0x00ff; ch -= 0x81;
cl -= 0x40;
return (ch<=0x7d && cl<=0xbe) ? wUnicodes[ch*0xbf+cl] : 0x1fff; */ } /*************************************************************************************************************************
* 函数 : u16 OneUNICODEtoGBK(u16 unicode)
* 功能 : 将unicode编码转换为GBK编码
* 参数 : unicode
* 返回 : GBK
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 20120602
* 最后修改时间 : 20120602
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneUNICODEtoGBK(u16 unicode) //用二分查找算法
{
u32 offset;
u16 temp;
UINT bw;
u8 buff[]; if(unicode<=0X9FA5)
{
if(unicode>=0X4E00)
offset=unicode-0X4E00;//0x1b87 //0X4E00,汉字偏移起点
else
return 0x2020; //不能显示的字符就给两个空格填充,否则乱码
}
else if(unicode>0X9FA5)//是标点符号
{
if(unicode<0XFF01||unicode>0XFF61)
return 0x2020;//没有对应编码 //不能显示的字符就给两个空格填充,否则乱码
offset=unicode-0XFF01+0X9FA6-0X4E00;
}
offset *= ; f_lseek(&UtoG_File, offset); //文件指针调到偏移位置
if(f_read(&UtoG_File, buff, , &bw) != FR_OK) //读取2字节
{
return 0x2020;
} temp = buff[];
temp <<= ;
temp += buff[];
return temp; //返回找到的编码
} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#else //码表直接在代码中
#include "unicode_gbk_code.h" /*************************************************************************************************************************
* 函数 : u8 GBK_UNICODE_Init(void)
* 功能 : 初始化GBK,UNICODE编码表
* 参数 : 无
* 返回 : 0:初始化成功;其它:初始化失败
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 2013-04-18
* 最后修改时间 : 2013-04-18
* 说明 : 无
*************************************************************************************************************************/
u8 GBK_UNICODE_Init(void)
{
return ;
} /*************************************************************************************************************************
* 函数 : u16 OneGBKtoUNICODE(u16 GBKCode)
* 功能 : 将GBK编码转换为unicode编码
* 参数 : GBK
* 返回 : unicode
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 20120602
* 最后修改时间 : 20120602
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneGBKtoUNICODE(u16 GBKCode)
{
u8 ch,cl; ch = GBKCode >> ;
cl = GBKCode & 0x00ff; ch -= 0x81;
cl -= 0x40;
return (ch<=0x7d && cl<=0xbe) ? wUnicodes[ch*0xbf+cl] : 0x1fff; } /*************************************************************************************************************************
* 函数 : u16 OneUNICODEtoGBK(u16 unicode)
* 功能 : 将unicode编码转换为GBK编码
* 参数 : unicode
* 返回 : GBK
* 依赖 : 底层读写函数
* 作者 : cp1300@139.com
* 时间 : 20120602
* 最后修改时间 : 20120602
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneUNICODEtoGBK(u16 unicode) //用二分查找算法
{
u32 offset;
u16 temp; if(unicode<=0X9FA5)
{
if(unicode>=0X4E00)
offset=unicode-0X4E00;//0x1b87 //0X4E00,汉字偏移起点
else
return 0x2020; //不能显示的字符就给两个空格填充,否则乱码
}
else if(unicode>0X9FA5)//是标点符号
{
if(unicode<0XFF01||unicode>0XFF61)
return 0x2020;//没有对应编码 //不能显示的字符就给两个空格填充,否则乱码
offset=unicode-0XFF01+0X9FA6-0X4E00;
}
offset *= ; temp = wGBKs[offset];
temp <<= ;
temp += wGBKs[offset+];
return temp; //返回找到的编码
} #endif //GBK_UNICODE_IS_SDCARD /*************************************************************************************************************************
* 函数 : void GBKToUnicode(u16 *pGBK, u16 *pUnicode, u32 cnt)
* 功能 : 将多个GBK编码转换为UNICODE
* 参数 : pGBK:GBK编码缓冲区
* pUnicode:UNCODE编码缓冲区
* cnt:转换编码个数
* 返回 : 无
* 依赖 : OneGBKtoUNICODE
* 作者 : cp1300@139.com
* 时间 : 20130403
* 最后修改时间 : 20130403
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
void GBKToUnicode(u16 *pGBK, u16 *pUnicode, u32 cnt)
{
while(cnt --)
{
*pUnicode = OneGBKtoUNICODE(*pGBK ++);
pUnicode ++;
}
} /*************************************************************************************************************************
* 函数 : void UnicodeToGBK(u16 *pUnicode, u16 *pGBK, u32 cnt)
* 功能 : 将多个UNICODE编码转换为GBK
* 参数 : pUnicode:UNCODE编码缓冲区
* pGBK:GBK编码缓冲区
* cnt:转换编码个数
* 返回 : 无
* 依赖 : OneUNICODEtoGBK
* 作者 : cp1300@139.com
* 时间 : 20130403
* 最后修改时间 : 20130403
* 说明 : 需要flash中的码表支持
GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
void UnicodeToGBK(u16 *pUnicode, u16 *pGBK, u32 cnt)
{
while(cnt --)
{
*pGBK = OneUNICODEtoGBK(*pUnicode ++);
pGBK ++;
}
}

修改cc963.c,FATFS的unicode编码支持文件

修改以下这个函数,主要讲这个文件里面的两个编码表注释掉,以实现节省单片机FLASH的目的。

#include "unicode_gbk.h" //编码转换
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 = OneGBKtoUNICODE(src);
}
else
{ /* Unicode to OEMCP */
c = OneUNICODEtoGBK(src);
}
} return c;
}
#endif

这样只要在初始化了FATFS之后马上初始化码表就可以实现用占用FLASH实现长文件名的支持,我的这个不光用在FATFS里面,还用在GSM模块的短信编码,解码上面。

FATFS外置UNICODE GBK双向转换码表(转)的更多相关文章

  1. UTF-8,Unicode,GBK,希腊字母读法,ASCII码表,HTTP错误码,URL编码表,HTML特殊字符,汉字编码简明对照表

    UNICODE,GBK,UTF-8区别 UNICODE,GBK,UTF-8区别    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那 ...

  2. unicode gbk 转换函数

    typedef unsigned short WCHAR; //字库信息结构体定义 //用来保存字库基本信息,地址,大小等 __packed typedef struct { u8 fontok; / ...

  3. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  4. Unicode,GBK,GB2312,UTF-8概念基础(转载)

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础本部分采用重用,转载一篇文章来完成这部分的目标.来源:holen'blog   对字符编码与Unicode,IS ...

  5. JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog   对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...

  6. 字符编码-UNICODE,GBK,UTF-8区别【转转】

    字符编码介绍及不同编码区别 今天看到这篇关于字符编码的文章,抑制不住喜悦(总结的好详细)所以转到这里来.转自:祥龙之子http://www.cnblogs.com/cy163/archive/2007 ...

  7. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  8. unicode 编码在线转换--javascript

    // unicode 编码在线转换工具--javascript 本人在网上搜索,看到有使用javascript做unicode编码转换的,感觉很好玩,所以拿来使用的. 这个功能有目前测试了两种: 1) ...

  9. unicode gbk utf-8的差异

    GB2312(1980年)定义,包含6763个汉字,682个字符 GBK1.0 定义了21003个汉字,21886个字符 ASCII->GB2312->GBK 编码方式向后兼容,即同一个字 ...

随机推荐

  1. 初探JavaScript魅力

    <style> #div1{width:200px; height:200px; background:red;} </style> </head> <scr ...

  2. HDU 2209 翻纸牌游戏

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  3. java 网络编程Socket编程

    Server.java import java.io.*; import java.net.*; public class Server { public static void main(Strin ...

  4. Problem A: 小火山的跳子游戏 多校训练2(小火山专场)(周期)

    题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1158&pid=0 zzuli 1905  题意:如果k=1的话是1,2,3,4. ...

  5. HDU 2546 饭卡 01背包变形

    题目大意:中文题就不多说了 题目思路:由题意可知,只要高于5元,就可以随便刷,那我们就把最贵的留在最后刷.但是如果低于5元就什么也不能刷(哪怕你要买的物品价格不足五元),所以我们可以先求出(n-5)元 ...

  6. 自己写的angularJs排序指令【原创】

    首先,给大家看看指令完成的效果.(请注意区分下面几张图片中,对象值的变化) 好了,效果图已经看完了,如果大家有兴趣的话可以继续往下看,接下来要讲的是关于angularJs中filter内置好的orde ...

  7. JAVA基础-抽象类

    1. 用abstract关键字来修饰一个类时, 这个类叫做抽象类, 用abstract修饰一个方法时, 该方法叫做抽象方法 2. 含有抽象方法的类必须被声明为抽象类, 3. 抽象类必须被继承, 抽象方 ...

  8. Moocryption

    Moocryption 题目描述 Unbeknownst to many, cows are quite fond of puzzles, particularly word puzzles. Far ...

  9. The 2014 ACMICPC Asia Regional Shanghai Online

    XorZip小队第一次合作,虽然结果还是有些可惜,但是状态和感觉都还不错. [A]数论+二分(-_-///) [B]Lucas定理+数位DP(-_-///) [C]LCA.LCT+树链剖分 [D]题目 ...

  10. 关联规则算法之FP growth算法

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...