嵌入式 linux 使用gbk,嵌入式操作系统中unicode编码和GBK编码的转换

前几天在用2440读取U盘数据的时候,遇到长文件名的读取,长文件名在FAT格式的文件系统中是以Unicode格式存放的,而一般的显示设备只支持GBK编码格式。因此,要想让读出来的汉字数据在显示屏等设备上正确显示出来就需要将Unicode编码的数据转换成对应的GBK码。

//GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。

想到两种方式来实现:一是用系统内置的函数来进行转换,这样当然最好了,写程序最简单;二是做一张转换表。无奈在系统内置函数里边没有找到对应的函数(用VC的时候可以用两个函数直接转换)。只能用第二种方式了自己做吧,而这张表的存放也又两种方式:一是在程序中存放,二是放在文件里放在U盘上,需要的时候读取。第一种方式占用程序的空间(20902 * 2 = 41804 字节)较大,但是执行较快,如果系统需要效率很高,可以忽略对空间的占用;在这里我选择了第二种存放方式。(之所以能做一张表是因为GBK和Unicode编码里的汉字是一一对应的)

顺着这个思路,从网上下载了Unicode向GBK转换的文件,直接放到U盘中,然后在需要转换的时候通过读取文件中的数据来得到需要的GBK编码,转换过程函数如下:

Void Unicode_to_GBK(unsigned char *ch)

{

unsigned int temp;

unsigned int sector_offset;              //扇区偏移

unsigned int byte_offset;                //字节偏移

unsigned char FATBuffer[512];

temp = *((unsigned int*)ch);           //由于FAT中文件民unicode码是 地字节在前,所以要按uint型读

temp -= 0x4e00;                            //减去基础数据

temp *= 2;                                    //每个汉字两个字节

sector_offset = temp/BytesPerSector;            //计算出扇区偏移,确定存在哪个扇区

byte_offset = temp% BytesPerSector;            //存在哪个字节

if(ReadSector(UNI2GBK + sector_offset,(uchar*)FATBuffer) != OK) //读那个扇区

return 0;

*ch = FATBuffer[byte_offset];                      //将数据读出

*(ch+1) = FATBuffer[byte_offset+1];

}

通过此函数就将ch所指的unicode类型编码的数据转换成了GBK编码了。

函数说明:

Ch:指向要转换的Unicode的指针

BytesPerSector:文件系统中每个扇区的字节数

FATBuffer:为读取文件系统时使用的缓冲区

UNI2GBK为Unicode向GBK转换表的文件所在的扇区。ReadSector函数为从U盘上读取从某个扇区开始的一扇区数据到缓存中去。

用类似的方法当然也可以实现GBK向Unicode编码的转换,这种转换在创建长文件名目录的时候很有用。

GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。

GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。

GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。 转自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值