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

来几张图片

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

显示中文名

欧路云:美国200G高防云-10元/月,香港云-15元/月,加拿大480G高防云-23元/月

欧路云 主要运行弹性云服务器,可自由定制配置,可选加拿大的480G超高防系列,也可以选择美国(200G高防)系列,也有速度直逼内地的香港CN2系列。所有配置都可以在下单的时候自行根据项目 需求来定制自由升级降级 (降级按天数配置费用 退款回预存款)。由专业人员提供一系列的技术支持!官方网站:https://www.oulucloud.com/云服务器(主机测评专属优惠)全场8折 优惠码:zhuji...

无忧云:洛阳BGP云服务器低至38.4元/月起;雅安高防云服务器/高防物理机优惠

无忧云怎么样?无忧云,无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点。一、无忧云官网点击此处进入无忧云官方网站二...

CloudCone闪购优惠洛杉矶MC机房VPS月$1.99 便宜可随意删除重开

CloudCone商家我们很多喜欢低价便宜VPS主机的肯定是熟悉的,个人不是特别喜欢他。因为我之前测试过几次,开通的机器IP都是不通的,需要删除且开通好几次才能得到一个可用的IP地址。当然他们家的优势也是有的,就是价格确实便宜,而且还支持删除重新开通,而且机房只有一个洛杉矶MC。实话,如果他们家能多几个机房,保持现在的特点,还是有很多市场的。CloudCone是来自美国的主机销售商,成立于2017...

unicode转换为你推荐
指纹iphonewordpress模板wordpress模板和主题是一个概念么复制党,广告党绕路linux防火墙设置LINUX系统怎么关闭防火墙支付宝蜻蜓发布怎么取得支付宝蜻蜓二代的代理?企业建网站我想建立一个企业网站,需要多少钱??企业建网站企业为什么要建网站重庆杨家坪猪肉摊主杀人重庆一市民发现买的新鲜猪肉晚上发蓝光.专家解释,猪肉中含磷较多且携带了一种能发光的细菌--磷光杆菌时支付宝注册网站在哪里注册支付宝账号flashfxp注册码求一个flashfxp v3.0.2的注册码资费标准中国电信套餐资费一览表2021
江西服务器租用 免费试用vps 域名主机基地 域名解析文件 美国主机排名 秒解服务器 免费主机 themeforest 海外服务器 56折 域名优惠码 英文简历模板word 稳定免费空间 傲盾官网 免费测手机号 360云服务 免费邮件服务器 西安服务器托管 湖南idc 群英网络 更多