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接口就行了.

时间: 2024-08-07 08:45:30

unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题(转)的相关文章

聊聊计算机中的编码(Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等)

作为一个程序员,一个中国的程序员,想来“乱码”问题基本上都遇到过,也为之头疼过.出现乱码问题的根本原因是编码与解码使用了不同而且不兼容的“标准”,在国内一般出现在中文的编解码过程中. 我们平时常见的编码有Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等,弄清这些编码之间的关系,就不难理解“乱码”出现的原因以及解决办法. 所谓字符集编码其实就是将字符(包括英文字符.特殊符号,控制字符,数字,汉子等)与计算机中的一个数字(二进制存储)一一对应起来,用这个数字来表示该字符

ASCII,Unicode,GBK和UTF-8字符编码的区别联系

ASCII,Unicode,GBK和UTF-8字符编码的区别联系 wyrssktzc11级分类:其他被浏览86次2016.05.27 检举 KingSta逍遥 采纳率:45%7级2016.05.27 ASCII.Unicode.GBK和UTF-8字符编码的区别联系 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出

php 解决json_encode中文UNICODE转码问题

原文地址:php 解决json_encode中文UNICODE转码问题 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似"\u***"的格式,如果想汉字不进行转码, 这里提供三种方法 1.升级PHP,在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode. 2.把汉字先urlencode然后再使用json_encode,json_e

java unicode转GBK

我们经常会遇到编码问题.Java号称国际化的语言,是因为它的class文件采用UTF-8,而JVM运行时使用UTF-16(至于为什么JVM中要采用UTF-16,我没看过 相关的资料,但我猜可能是因为JAVA里面一个字符(char)就是16位的,而UTF-16正是双字节编码),都是unicode的编码. unicode 的目标就是能支持世界上所有的字符集,也就是说几乎所有的字符集包含的字符在unicode中都有对应的编码.在unicode中,字符与代码的映射关 系,就是unicode字符集,称为U

php 解决json_encode中文null和UNICODE转码问题

1.iconv("gb2312","utf-8//IGNORE",$str),转码,这样转码后显示的汉字是uicode码,下面将unicode转为中文2.$array = array( 'test'=>urlencode("我是测试") ); $array = json_encode($array); echo urldecode($array); //{"test":"我是测试"} php 解决js

unicode和gbk的互相转换

unicode和gbk的互相转换主要依靠window下的escape和unescape方法,然后把%u替换成\u就好了; var GB2312UnicodeConverter = { ToUnicode: function (str) { return escape(str).toLocaleLowerCase().replace(/%u/gi, '\\u'); } , ToGB2312: function (str) { return unescape(str.replace(/\\u/gi,

关于UTF-8、ASCII、Unicode、gbk、gb2312之间的关系的笔记

一直对于字符编码不是很清晰,只知道所有都sublime编辑文档时候设置:文档编码为UTF-8.PHP的header也就是浏览器http响应头显示UTF-8.HTML的meta信息也声明为UTF8.数据库字符集选择utf8.排序规则选择utf-8_ general_ci,但是一直不知道他们是什么来的,今天刷下百度百科:有一篇写的太好了: https://www.zhihu.com/question/23374078 以上总结就是 ASCII => GB2312 => GBK =>  Uni

解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换

一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码:默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/MS936/windows-936) 二.编码知识科普Qt常见的两种编码是:UTF-8和GB

paip.utf-8,unicode编码的本质输出unicode文件原理 python

#别的语言,java php都是unicode,走十python不一样. #enddef #todo write to unicode encode fileHandle = open ( r"c:\fmtSmpEnRst.txt", 'w',encoding="UTF-16" ) #todox utf8 not decode...now  UTF-16是Unicode lines=file2list(f, encode="utf-16") 作者