shell编程/字库裁剪(1)——想法
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7679024.html 作者:窗户 QQ:6679072 E-mail:6679072@qq.com
我写这个帖子的意图,在于三个:
1.用代码生成代码的思维。
2.shell编程的思路。
3.裁剪字库的具体程序。
我打算分为三节来说:
第一节讲裁剪词库的意义以及使用场合;
第二节讲如何用shell来解决这个问题;
第三节讲如何测试结果。
很多带有点阵液晶的硬件项目可能需要显示汉字、ASCII字符,有的廉价的液晶里没有字库,有的液晶里带有了字库但可能需要其他字体的支持。这种时候我们就需要使用外置的字库了。一般一个字库需要几百K大小,当然对于有外置flash的情况下根本不算什么,但有些时候我们在设计硬件的时候出于硬件成本、PCB尺寸等因素考虑,并不会采用外部存储,现在的嵌入式处理器公司都会在SOC上给一定的flash,足够你正常的编程使用,比如我们熟悉的STM32系列,它由ST公司(意法半导体)出品的基于ARM的SOC,有着自己的相对统一的开发库,可选器件品类繁多,是裸机运行的首选。
SOC上的flash一般尺寸相对很小,几百K的字库很可能超标,甚至本身就没这么大。那么在这种情况下,如果还想使用字库,只好对字库进行裁剪,这也是笔者这个主题的背景情况。当然,也会有FPGA来控制液晶、VGA等情况的时候也需要裁剪字库,但不在我这个的考虑范围内,我这个题材只是针对C语言编程。
我们来试想一下,对于ASCII码,即便是16X8的字库,总共也就2k不到,基本可以完全忍受下来,所以主要考虑裁剪的是汉字。如果是完整的汉字字库,那么显示汉字可以直接根据GB2312码来算出二进制编码,这个可以在baidu里面搜索GB2312字库的偏移,里面可以查到很多文章可以说明GB2312字库的偏移,细节不在这里讨论。直接写结果,GB2312的编码为两个字节,假设某个汉字的GB2312编码第一个字节为GBH,第二个字节为GBL,并且每个汉字字体在字库中的大小为s,那么这个汉字在字库中的偏移为
offset = [ (GBH - 161) * 94 + (GBL - 161) ] * s
一般使用的是16X16字库,那么s=16*16/8=32,当然也有使用其他大小,比如12X12,那么s=12*12/8=18。
如果要用到繁体字,那么可以采用GBK编码和GBK字库,公式类似,本文只考虑GB2312。
在具体应用中,可以对于所有使用的汉字按照编码大小顺序提取,生成一个数组;然后有两种解决方法:
1.再建立一个所使用汉字编码大小顺序的有序数组,在寻找汉字字体的时候采用二分查找法找到汉字编码在数组中的偏移ofs,从而知道所选字体在字体数组中的偏移ofs/2*s。
2.把程序中的汉字都替换成偏移,这可以换来更快的运行速度(虽然只快了那么微小的一点点)和更快的存储,但最后是以牺牲程序可读性为前提的,所以一般情况下不建议如此,代码不仅仅是给机器读也是要给人读的。
shell编程/字库裁剪(1)——想法的更多相关文章
- shell编程/字库裁剪(2)——编程过程
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...
- shell编程/字库裁剪(1)
我写这个帖子的意图,在于三个: 1.用代码生成代码的思维. 2.shell编程的思路. 3.裁剪字库的具体程序. 我打算分为三节来说: 第一节讲裁剪裁剪词库的意义以及使用场合: 第二节讲如何用shel ...
- shell编程/字库裁剪(3)——验证
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7712496.html 作者:窗户 Q ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- shell编程:定义简单标准命令集
shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...
- Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- Linux_10------Linux之shell编程------变量
.-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...
- 需要交互的shell编程——EOF(转载)
在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...
随机推荐
- shell编程基础(五): 正则表达式及其使用
正则表达式 1.前情提要 以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义.其实grep还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合xxxx ...
- 第一册:lesson forty nine。
原文: At the butcher's A:Do you want any meat today,Mrs.B? B:Yes,please. A:Do you want beef or lamb? B ...
- oracle expdp自动备份脚本
windows: @echo off echo ================================================ echo Windows环境下Oracle数据库的自动 ...
- 升级ssh到OpenSSH_7.5p1
Redhat 6.5 x64升级SSH到OpenSSH_7.5p1 为了防止openssh安装失败导致不能远程登录,先部署telnet服务以防万一. rpm -qa telnet telnet-ser ...
- 菜鸟入门【ASP.NET Core】14:MVC开发:UI、 EF + Identity实现、注册实现、登陆实现
前言 之前我们进行了MVC的web页面的Cookie-based认证实现,接下来的开发我们要基于之前的MvcCookieAuthSample项目做修改. MvcCookieAuthSample项目地址 ...
- Centos 7.6搭建LNMP环境的web服务器
一.安装软件 1.1.MYSQL安装 下载mysql的repo源: wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rp ...
- 【Java每日一题】20170217
20170216问题解析请点击今日问题下方的“[Java每日一题]20170217”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...
- oracle中row_number() over()
ROW_NUMBER() OVER函数的基本用法语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)简单的说row_number()从1开 ...
- SQLite: sql script demo
如果有成熟的架构,如何根据数据库关系的表.视图等,进行代码生成架构?减少写代码的时间? -- 考虑主键外键 -- create database geovindu; use geovindu; --2 ...
- vue+vuecli+webpack中使用mockjs模拟后端数据
前言 使用mockjs可以事先模拟数据,前提是和后端约定好了数据接口,怎样的数据.使用mock就可以生成你要的数据了,从而实现开发时前后端分离. 其主要功能是: 基于数据模板生成模拟数据. 基于HTM ...