前几天在用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个造字码位,简、繁体字融于一库。 转自