FATFS外置UNICODE GBK双向转换码表(转)

源: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
 * 功能:        汉字编码转换
 * 作者:        [email protected]
 * 创建时间:    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:初始化成功;其它:初始化失败
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    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 1;
    }

    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 1;
    }

    return 0;
}

/*************************************************************************************************************************
* 函数    :    u16 OneGBKtoUNICODE(u16 GBKCode)
* 功能    :    将GBK编码转换为unicode编码
* 参数    :    GBK
* 返回    :    unicode
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    20120602
* 最后修改时间 : 20120602
* 说明    :     需要flash中的码表支持
            GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneGBKtoUNICODE(u16 GBKCode)
{
    u8 ch,cl;
    UINT bw;
    u16 data;

    ch = GBKCode >> 8;
    cl = GBKCode & 0x00ff;

    ch -= 0x81;
    cl -= 0x40;

    f_lseek(&GtoU_File, (ch*0xbf+cl)*2);                        //文件指针调到偏移位置
    if(f_read(&GtoU_File, (u8 *)&data, 2, &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
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    20120602
* 最后修改时间 : 20120602
* 说明    :     需要flash中的码表支持
            GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneUNICODEtoGBK(u16 unicode)  //用二分查找算法
{
    u32 offset;
    u16 temp;
    UINT bw;
    u8 buff[2];

    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 *= 2;

    f_lseek(&UtoG_File, offset);                        //文件指针调到偏移位置
    if(f_read(&UtoG_File, buff, 2, &bw) != FR_OK)    //读取2字节
    {
       return 0x2020;
    }

    temp = buff[0];
    temp <<= 8;
    temp += buff[1];
    return temp;    //返回找到的编码
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#else                                //码表直接在代码中
#include "unicode_gbk_code.h"

/*************************************************************************************************************************
* 函数    :    u8 GBK_UNICODE_Init(void)
* 功能    :    初始化GBK,UNICODE编码表
* 参数    :    无
* 返回    :    0:初始化成功;其它:初始化失败
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    2013-04-18
* 最后修改时间 : 2013-04-18
* 说明    :     无
*************************************************************************************************************************/
u8 GBK_UNICODE_Init(void)
{
    return 0;
}

/*************************************************************************************************************************
* 函数    :    u16 OneGBKtoUNICODE(u16 GBKCode)
* 功能    :    将GBK编码转换为unicode编码
* 参数    :    GBK
* 返回    :    unicode
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    20120602
* 最后修改时间 : 20120602
* 说明    :     需要flash中的码表支持
            GBK码范围,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 OneGBKtoUNICODE(u16 GBKCode)
{
    u8 ch,cl;

    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
* 依赖    :    底层读写函数
* 作者    :    [email protected]
* 时间    :    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 *= 2;

    temp = wGBKs[offset];
    temp <<= 8;
    temp += wGBKs[offset+1];
    return temp;    //返回找到的编码
}

#endif //GBK_UNICODE_IS_SDCARD

/*************************************************************************************************************************
* 函数    :    void GBKToUnicode(u16 *pGBK, u16 *pUnicode, u32 cnt)
* 功能    :    将多个GBK编码转换为UNICODE
* 参数    :    pGBK:GBK编码缓冲区
*             pUnicode:UNCODE编码缓冲区
*             cnt:转换编码个数
* 返回    :    无
* 依赖    :    OneGBKtoUNICODE
* 作者    :    [email protected]
* 时间    :    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
* 作者    :    [email protected]
* 时间    :    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模块的短信编码,解码上面。

时间: 2024-12-31 06:18:20

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

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

UNICODE,GBK,UTF-8区别 UNICODE,GBK,UTF-8区别    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就O

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

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习. 中文编码问题的处理核心都是--保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用Unicode字

UNICODE,GBK,UTF-8区别

UNICODE,GBK,UTF-8区别    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了.详细的就见下面转的这篇文章. 谈谈

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

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习.        中文编码问题的处理核心都是——保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用U

UNICODE,GBK,UTF-8

UNICODE,GBK,UTF-8 UNICODE,GBK,UTF-8    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了.详

UNICODE,GBK,UTF-8区别【转载】

UNICODE,GBK,UTF-8区别 简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了.详细的就见下面转的这篇文章. 谈谈Uni

ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结

这两天碰见一个Bug,涉及到字符编码,一通乱搜后,索性研究了下,整理出来,以便今后查阅. ASCII码,0~127,128个,这个就不用多说了,他是计算机文明的基石.但是这里面只有英文字母,其他国家如何把本国的文字输入到电脑中呢?所以基本每种语言都有自己的字符集,如汉字就有GB2312(简体中文),BIG5(繁体中文)等等. 但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式.

java GBK字符转换成为UTF-8编码字符

import java.util.HashMap; import java.util.Map; /** * 创建日期: 2014-04-18 10:36:25 * 作者: 黄飞 * mail:[email protected] [email protected] * ©版权归作者所有 * */ public class ConverFromGBKToUTF8 { public static void main(String[] args) { try { ConverFromGBKToUTF8

Ansi UNICODE,GBK,UTF-8区别

http://my.oschina.net/saintzbs/blog/165034 http://my.oschina.net/saintzbs/blog/165034 http://www.cnblogs.com/cy163/archive/2007/05/31/766886.html 1:可以借助于文本编辑页面和Compare进行理解.      Unicode.utf-8.GB2312等,但是在windows命令行里敲notepad进入文本编辑页面.保存时需要选择编码方式,但是不存在GB