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

来几张图片

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

显示中文名

轻云互联(19元)香港高防云服务器 ,美国云服务器

轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。活动规则:用户购买任意全区域云服务器月付以上享受免费更换IP服...

RAKsmart含站群服务器/10G带宽不限流量首月半价

RAKsmart 商家估摸着前段时间服务器囤货较多,这两个月的促销活动好像有点针对独立服务器。前面才整理到七月份的服务器活动在有一些配置上比上个月折扣力度是大很多,而且今天看到再来部分的服务器首月半价,一般这样的促销有可能是商家库存充裕。比如近期有一些服务商挖矿服务器销售不好,也都会采用这些策略,就好比电脑硬件最近也有下降。不管如何,我们选择服务器或者VPS主机要本着符合自己需求,如果业务不需要,...

桔子数据58元/月 ,Cera美西云服务器 2核4G 50G数据盘 500M带宽 1000G流量

桔子数据(徐州铭联信息科技有限公司)成立于2020年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。 公司一直秉承”以人为本、客户为尊、永...

unicode转换为你推荐
操作httpasp.net网页制作ASP.NET设计网页的方法?ipad代理想买个ipad买几代性价比比较高新团网美团网是谁创办的呀?购物车通过自己的体会总结购物车的作用小型汽车网上自主编号申请请问各位大虾,如何在网上选车牌号?瞄准的拼音穿越火线枪战王者辅助瞄准什么意思狙击辅助什么是通配符dir是什么申请400电话400电话如何办理?美国独立美国独立的意义
www二级域名 什么是域名 海外域名注册 美国服务器租用 sockscap 万网优惠券 中国特价网 合肥鹏博士 大容量存储器 gspeed jsp空间 129邮箱 阿里校园 免费cdn 如何安装服务器系统 免费ftp web应用服务器 国内域名 中国电信测速网站 photobucket 更多