zoukankan      html  css  js  c++  java
  • 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[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接口就行了.

  • 相关阅读:
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4681831.html
Copyright © 2011-2022 走看看