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

来几张图片

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

显示中文名

搬瓦工VPS:高端线路,助力企业运营,10Gbps美国 cn2 gia,1Gbps香港cn2 gia,10Gbps日本软银

搬瓦工vps(bandwagonhost)现在面向中国大陆有3条顶级线路:美国 cn2 gia,香港 cn2 gia,日本软银(softbank)。详细带宽是:美国cn2 gia、日本软银,都是2.5Gbps~10Gbps带宽,香港 cn2 gia为1Gbps带宽,搬瓦工是目前为止,全球所有提供这三种带宽的VPS(云服务器)商家里面带宽最大的,成本最高的,没有第二家了! 官方网站:https...

妮妮云,美国cera CN2线路,VPS享3折优惠

近期联通CUVIP的线路(AS4837线路)非常火热,妮妮云也推出了这类线路的套餐以及优惠,目前到国内优质线路排行大致如下:电信CN2 GIA>联通AS9929>联通AS4837>电信CN2 GT>普通线路,AS4837线路比起前两的优势就是带宽比较大,相对便宜一些,所以大家才能看到这个线路的带宽都非常高。妮妮云互联目前云服务器开放抽奖活动,每天开通前10台享3折优惠,另外...

杭州王小玉网-美国CERA 2核8G内存19.9元/月,香港,日本E3/16G/20M CN2带宽150元/月,美国宿主机1500元,国内宿主机1200元

官方网站:点击访问王小玉网络官网活动方案:买美国云服务器就选MF.0220.CN 实力 强 强 强!!!杭州王小玉网络 旗下 魔方资源池 “我亏本你引流活动 ” mf.0220.CNCPU型号内存硬盘美国CERA机房 E5 2696v2 2核心8G30G总硬盘1个独立IP19.9元/月 续费同价mf.0220.CN 购买湖北100G防御 E5 2690v2 4核心4G...

unicode转换为你推荐
亿元支付宝检索网易yeahaccessdenied升级后出现Access denied 如何解决进入查看linux防火墙设置如何在Linux中启动/停止和启用/禁用FirewallD和Iptables防火墙sqlserver数据库SQL Server 数据库 (+) 这个是什么意思360公司迁至天津奇虎360公司在哪?生药http本公司www开放平台众安开放平台是干什么的?上面的众推广是什么?银花珠树晓来看下雪喝酒的诗句
北京租服务器 息壤主机 ix主机 网站实时监控 合租空间 cdn联盟 美国免费空间 河南移动m值兑换 gtt 上海电信测速网站 路由跟踪 什么是web服务器 摩尔庄园注册 可外链的相册 万网注册 七十九刀 石家庄服务器 碳云 qq空间打开很慢 压力测试工具 更多