汉字GBK字库及其与unicode间的转换(

unicode转换  时间:2021-04-12  阅读:()

[资料]GBK字库及其与unicode间的转换(用于mp3文件名的显示)经过几天的摸索终于可以显示mp3的中文名了。

现在将我做的资料与大家分享想做mp3的朋友可以试试。

点击此处下载armok01141262 rar

上面的文件是我在网上搜索的素材我自己编了些小程序将其转换成两张表 即unicod e与gbk相互转换的表。

点击此处下载armok01141263 rar

上面是我用程序产生的GBK字符是按照顺序存放的用这个文件配合我前几天发的“GB2312字库制作方法”中的程序用于生成GBK字库点阵。

点击此处下载armok01141264 rar

上面的文件是我最终生成的用于mp3的4个文件了。st12 sys为gbk字库12*12的点阵文件取模方式“纵向取模高位在下” 我用的液晶是128*64 ks0108兼容LCD模块st16 sys为gbk字库16*16的点阵

以上两个文件的起始汉字是以0x8140开始的为了在程序中能线形查找其中不存在的编码如0x**7f0x**ff等均在编码内只不过不会用到。也就是说从0 x8140~0 xfeff其中高位从0 x81到0 xfe地位从0 x40到0xff即126*192=24192个汉字数据。

因此12*12的点阵文件大小是580608Bytes 每个汉字用24字节汉字下半截虽用4bits但是存储是按8bits16*16的点阵文件大小是774144Bytes 每个汉字用32字节uni2gbk sy s为unicode转gbk的表从unicode的0 x4e00到0 x9fa5顺序存放着相应的gbk码总共20902个汉字对应的文件是41804Bytes

注 由于没有找到一些符号的unicode对照表 因此这张表中只包含了汉字部分。因此不能显示诸如“”  等符号程序中要做相应处理。

注文件存放方式是高字节在前比如0x4e00存放方式为0x4e 0x00gbk2uni sy s为gbk转unicode的表从gbk的0 x8140到0 xfeff即126*192=24192按照gbk的编码顺序放为了线形查找其中不合法的或根据资料没有相应unicode码的都作了填零处理。文件大小为48384Bytes注文件存放方式是高字节在前比如0x4e00存放方式为0x4e 0x00

用的时候要把上面的4个文件拷贝到sd卡中或u盘中注意为了程序好处理不要让这4个文件产生碎片要连续的存放最好的方法是格式化后再把这几个文件拷过去。

下面说说如何在程序中处理

首先是初始化

#include"LCD_GBK h"

unsigned long GBK12,GBK16,GBK2UNI,UNI2GBK;//用于存放四个文件的起始扇区extern unsigned long FirstDataSector;//第一个数据扇区extern unsigned int SectorsPerClust;//每簇扇区数extern unsigned int BytesPerSector;//每扇区字节数unsigned char GBK_Buffer[32];//单个汉字点阵数据缓冲unsigned char GBK_Ini()//gbk初始化

{

GBK12=FAT_Open("\\st12 sys");//打开文件得到簇号if(GBK 12==1)return 1;

GBK16=FAT_Open("\\st16 sys");if(GBK 16==1)return 1;

GBK2UNI=FAT_Op en("\\gbk2uni sy s");if(GBK2UNI==1)return 1;

UNI2GBK=FAT_Open("\\uni2gbk sys");if(UNI2GBK==1)return 1;

//将簇号转成扇区号

GBK12 = (unsigned long)FirstDataSector+(unsigned long)(GBK12 - 2)*(unsignedlong)Se ctorsPerClust;//calcu late the actual sector number

GBK16 = (unsigned long)FirstDataSector+(unsigned long)(GBK16 - 2)*(unsignedlong)Se ctorsPerClust;//calcu late the actual sector number

GBK2UNI = (unsigned long)FirstDataSector+(unsigned long)(GBK2UNI - 2)*(unsignedlong)Se ctorsPerClust;//calcu late the actual sector number

UNI2GBK = (unsigned long)FirstDataSector+(unsigned long)(UNI2GBK - 2)*(unsignedlong)Se ctorsPerClust;//calcu late the actual sector numberreturn 0;

}

这样可以得到四个文件的起始扇区接下来的操作在此基础上加上偏移量就可以了无须再次寻找文件。

其中FAT_Op en("\\st 12 sys");//打开文件得到簇号

该函数实现寻找根目录下st12sys的起始簇这个FAT函数可以搜索一下我以前发的帖子那里有完整的程序。

根据汉字内码找其点阵数据unsigned char Re ad_One_GBK 16(unsigned char*ch)

{unsigned int temp 1;unsigned char temp 2;unsigned int sector_offset;//扇区偏移unsigned int byte_offset;//字节偏移unsigned char buffer[512];t emp 1=*ch;t emp 2=*(ch+1);if(t emp 1<0x81| |t emp 2<0x40)return 1;//不合法的汉字temp 1-=0x81;//的到类似于2312的区号t emp 2-=0x40;//位号temp 1*=192;//xx7f and xxff are includedtemp 1+=temp 2;//得到偏移

//temp 1*=24;sector_offs et=temp 1/(BytesP erSector/32);//算出要读哪个扇区byte_offs et=(temp 1%(BytesP erSector/32))*32;//算出要读扇区的哪个字节

if(FAT_ReadSector(GBK 16+s ector_offset,buffer))return 1;//读要读的扇区for(temp 2=0,temp 1=byte_offs et;temp 2<32;temp 2++,temp 1++)GBK_Buffer[temp 2]=buffer[temp 1];//复制要复制的数据return 0

}

注意由于在设计时非法的编码如0x**7f与0x**ff都计在内所以每个区有192个汉字而不是190个这是16*16的程序

12*12的程序稍复杂一点因为512/24不能除尽因此还要判断是不是有数据在下一个扇区。其代码如下没加注释unsigned char Re ad_One_GBK 12(unsigned char*ch)

{unsigned long temp 1;unsigned char temp 2;unsigned int sector_offset;unsigned int byte_offset;unsigned char buffer[512];t emp 1=*ch;t emp 2=*(ch+1);if(t emp 1<0x81| |t emp 2<0x40)return 1;temp 1-=0x81;t emp 2-=0x40;temp 1*=192;//xx7f and xxff are includedtemp 1+=temp 2;

temp 1*=24;s ector_offs et=temp 1/BytesP erSector;byte_offs et=temp 1%BytesP erSector;if(FAT_ReadSector(GBK 12+s ector_offset,buffer))return 1;if(by te_offs et>488)

{for(temp 2 = 0,temp 1 = by te_offs et;temp 2<(BytesP erSector -byt e_offs et);t emp 2++,t emp 1++)GB K_Buffer[t emp 2]=buffer[t emp 1];if(FAT_ReadSector(GBK 12+s ector_offs et+1,buffer))return 1;for(temp 1=0;temp 2<24;temp 2++,temp 1++)GBK_Buffer[temp 2]=buffer[temp 1];

}els e for(temp 2=0,temp 1=by te_offs et;temp 2<24;temp 2++,temp 1++)GBK_Buffer[temp 2]=buffer[temp 1];return 0;

}

至于显示我就不说了不同的液晶操作不同只要把读出的数据按照你的LCD的操作方法写进去即可。unicode到gbk的转换。unsigned char Unicode_to_GBK(unsigned char*ch)

{unsigned int temp;unsigned int sector_offset;//扇区偏移unsigned int byte_offset;//字节偏移

unsigned char buffer[512];t emp=*((uns igned int*)ch);//由于FAT中文件民unicode码是地字节在前所以要按uint型读temp-=0x4e00;//减去基础数据t emp*=2;//每个汉字两个字节s ector_offs et=t emp/Byt esP erSector;//计算出扇区偏移确定存在哪个扇区byt e_offs et=t emp%Byt esP erSect or;//存在哪个字节if(FAT_ReadSector(UNI2GBK+sector_offset,buffer))return 1;//读那个扇区

*ch=buffer[by t e_offs et];//将数据读出

*(ch+1)=buffer[byt e_offs et+1];return 0;

}

要注意的是FAT中文件名的存放方式是低字节在前而gbk的存放是高字节在前操作时不要搞混了。gbk到unicode的转换mp 3种用不着所以我也就没试过程序也没写 因此那四个文件 gbk2uni sy s可以不拷。

由于资料有限unicod e的编码只有汉字部分即所谓的“中日韩统一汉字编码” 2w多汉字显示汉字肯定是没问题了有些符号没有。希望大家去完善一下。

谢谢ouravr的各位朋友

来几张图片

试验用的板子已经在这出现好多次了

显示中文名

亚洲云Asiayu,成都云服务器 4核4G 30M 120元一月

点击进入亚云官方网站(www.asiayun.com)公司名:上海玥悠悠云计算有限公司成都铂金宿主机IO测试图亚洲云Asiayun怎么样?亚洲云Asiayun好不好?亚云由亚云团队运营,拥有ICP/ISP/IDC/CDN等资质,亚云团队成立于2018年,经过多次品牌升级。主要销售主VPS服务器,提供云服务器和物理服务器,机房有成都、美国CERA、中国香港安畅和电信,香港提供CN2 GIA线路,CE...

Linode 18周年庆典活动 不断改进产品结构和体验

今天早上相比很多网友和一样收到来自Linode的庆祝18周年的邮件信息。和往年一样,他们会回顾在过去一年中的成绩,以及在未来准备改进的地方。虽然目前Linode商家没有提供以前JP1优化线路的机房,但是人家一直跟随自己的脚步在走,确实在云服务器市场上有自己的立足之地。我们看看过去一年中Linode的成就:第一、承诺投入 100,000 美元来帮助具有社会意识的非营利组织,促进有价值的革新。第二、发...

什么是BGP国际线路及BGP线路有哪些优势

我们在选择虚拟主机和云服务器的时候,是不是经常有看到有的线路是BGP线路,比如前几天有看到服务商有国际BGP线路和国内BGP线路。这个BGP线路和其他服务线路有什么不同呢?所谓的BGP线路机房,就是在不同的运营商之间通过技术手段时间各个网络的兼容速度最佳,但是IP地址还是一个。正常情况下,我们看到的某个服务商提供的IP地址,在电信和联通移动速度是不同的,有的电信速度不错,有的是移动速度好。但是如果...

unicode转换为你推荐
conn.aspconn.asp 在哪打开?应该怎样打开?Flash动画设计与制作——第九章:导出和发布动画outlookexpressoutlook express 是什么?特朗普吐槽iPhone华为余承东吐槽iPhone X,除了贵啥优点都没有申请支付宝账户怎么申请支付宝的账号?sns网站有哪些最近两年哪些SNS网站比较火大飞资讯单仁资讯集团怎么样加多宝和王老吉王老吉和加多宝的区别传奇域名谁能帮忙查查传奇的IP和域名95188是什么电话95188是什么号码我刚收到短信是什么支付宝的验证码
武汉域名注册 香港vps主机 vps优惠码cnyvps justhost highfrequency pw域名 美元争夺战 域名优惠码 unsplash 主机屋免费空间 panel1 香港新世界中心 申请网站 德隆中文网 贵阳电信测速 成都主机托管 godaddy退款 phpwind论坛 hosts文件修改 weblogic部署 更多