汉字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的各位朋友

来几张图片

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

显示中文名

PacificRack - 洛杉矶QN机房 低至年$7.2 同有站群多IP地址VPS主机

需要提前声明的是有网友反馈到,PacificRack 商家是不支持DD安装Windows系统的,他有安装后导致服务器被封的问题。确实有一些服务商是不允许的,我们尽可能的在服务商选择可以直接安装Windows系统套餐,毕竟DD安装的Win系统在使用上实际上也不够体验好。在前面有提到夏季促销的"PacificRack夏季促销PR-M系列和多IP站群VPS主机 年付低至19美元"有提到年付12美元的洛杉...

HostYun:联通AS9929线路,最低月付18元起,最高500Mbps带宽,洛杉矶机房

最近AS9929线路比较火,联通A网,对标电信CN2,HostYun也推出了走联通AS9929线路的VPS主机,基于KVM架构,开设在洛杉矶机房,采用SSD硬盘,分为入门和高带宽型,最高提供500Mbps带宽,可使用9折优惠码,最低每月仅18元起。这是一家成立于2008年的VPS主机品牌,原主机分享组织(hostshare.cn),商家以提供低端廉价VPS产品而广为人知,是小成本投入学习练手首选。...

#消息# contabo:德国老牌机房新增美国“纽约、西雅图”数据中心,免设置费

运作了18年的德国老牌机房contabo在继去年4月开办了第一个美国数据中心(中部城市:圣路易斯)后立马在本月全新上马两个数据中心:纽约、西雅图。当前,为庆祝美国独立日,美国三个数据中心的VPS全部免除设置费,VPS本身的配置很高,价格适中,有较高的性价比!官方网站:https://contabo.com/en/SSD VPSKVM虚拟,纯SSD阵列,不限制流量,自带一个IPv4内存CPUSSD带...

unicode转换为你推荐
目录盐城市第八届人大常委会第五次会议纪要phpcms模板phpcms在后台怎样改模板googleprGOOGLE PR是什么意思中国企业信息网中国企业网怎么样360arp防火墙在哪谁知道360防火墙的arp防火墙文件在哪阅读http客服电话各银行的客服电话是多少?温州商标注册温州代理注册个商标是怎么收费的?颁发的拼音发字的多音字组词团购程序有什么好用的社区团购小程序?
根域名服务器 独享100m hostgator 免费主机 edis 最好看的qq空间 亚洲小于500m 777te 息壤代理 metalink 网站在线扫描 空间首页登陆 视频服务器是什么 东莞服务器托管 工信部网站备案查询 国外网页代理 测试网速命令 rewritecond web服务器有哪些 vi命令 更多