版权申明:本文为博主窗户(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)——想法的更多相关文章

  1. shell编程/字库裁剪(2)——编程过程

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...

  2. shell编程/字库裁剪(1)

    我写这个帖子的意图,在于三个: 1.用代码生成代码的思维. 2.shell编程的思路. 3.裁剪字库的具体程序. 我打算分为三节来说: 第一节讲裁剪裁剪词库的意义以及使用场合: 第二节讲如何用shel ...

  3. shell编程/字库裁剪(3)——验证

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7712496.html 作者:窗户 Q ...

  4. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  5. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  6. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  7. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  8. Linux_10------Linux之shell编程------变量

    .-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...

  9. 需要交互的shell编程——EOF(转载)

    在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...

随机推荐

  1. 《Thinking In Java》---第四版 练习题答案

    百度网盘下载:https://pan.baidu.com/share/link?shareid=2111776725&uk=2869544179&app=zd 在线查看:http:// ...

  2. Javascript Cookie小插件

    var ManagerCookie = function(){ //添加cookie function addCookie(key,value,time,path){ key = encodeURI( ...

  3. 跨域学习笔记1--跨域调用webapi

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...

  4. Linux学习笔记之Django项目部署(CentOS)

    一.引入 用Django写了一个测试的项目,现在要部署在Linux上,一般这种情况下,只要在项目里面敲一行命令:python manage.py runserver 0.0.0.0:8000就行了.但 ...

  5. 【Java每日一题】20170320

    20170317问题解析请点击今日问题下方的“[Java每日一题]20170320”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  6. JSJ——java基本概念二

    当Java虚拟机启动执行时,它会寻找你在命令列所指定的类.每个Java程序最少都会有一个类以及一个main().每个应用程序只有一个main()函数.然后它会锁定像下面这样一个特定的方法: publi ...

  7. springboot调优

    application.properties server.tomcat.max-connections=0 # Maximum number of connections that the serv ...

  8. C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

    一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...

  9. angular select2 ng-model 取值 ng-change调用方法

    页面: 引入文件 '/select2.css', '/select2-bootstrap.css', '/select2.min.js', '/ui-select2.js' html: <div ...

  10. Django-Oscar小记:如何使用高版本Django开发网页的SEO模块

    在使用Google搜索Django的SEO插件时,很多插件都没有更新到Python3.x,有的插件更新到了Python的高版本,但是不适用于Django的2.x. Django在升级到版本2.x的时候 ...