figlet可以用来画ASCII的字符,很是有趣。
____ _ __
| _ \ _____ ____| |/ _|
| |_) / _ \ \/ / _` | |_
| _ < __/> < (_| | _|
|_| \_\___/_/\_\__,_|_|
但是要支持中文则是比较麻烦的一件事情,首先现在开源社区基本都是用UTF-8字符了,甚至连Unicode都不太肯使用。但是figlet官方提供的字库International fonts里面包含了fg16st和fg16fs两种字体,也就是宋体和仿宋体。但是因为作者不是中国人,所以对编码犯了很多常识性质的错误,写本博文的时候,其2.2.5的源码中这样定义的:
#define DATE "31 May 2012"
#define VERSION "2.2.5"
#define VERSION_INT 20205
也就是2012年五月的时候,这个写于1991年的工具,中间依然有2007年王璐指出的严重常识性质的错误。非常严重的错误,致使从逻辑上不可能支持中文。
当然在读了一会儿源码之后,就会发觉这个2100+行的figlet.c,实际上比较简单,逻辑应该算是比较简单的了。
1.效果
先上两张图片来说明
2.程序调用图
3.修改过程简记
待我修改完整,并把UTF-8字体也转化一个之后,整理好自定义字体转化工具后会发布一个github。 基本上完全按照王璐就可以很好地解决了,只是现在问题还不是很完美。所以暂时还不公布代码
4.编码问题
先上图说明一个我遇到的问题,因为我系统是因为所以我一直以为gcc提示本身是英文的,今天才发现,当我在右键Options里面Text–>Locale:zh_CN;Character set GBK;然后cygwin的各个命令全部变成中文了;不过运行octopress则如下的错误。显然我需要不停地改设置来运行不同的程序了。 当然应该有一个解决方案就是把figlet转化一个UTF-8的Control File出来就好了。
GBK的子集GB2312
GB2312是GBK的子集,GBK是GB18030的子集。GB2312编码大约包含6000多汉字(不包括特殊字符),编码范围为第一位b0-f7,第二位编码范围为a1-fe(第一位为cf时,第二位为a1-d3),计算一下汉字个数为6762个汉字。当然还有其他的字符。包括控制键和其他字符大约7573个字符编码。
GBK是包括中日韩字符的大字符集合,GBK编码是对GB2312编码的扩充,容纳的汉字更多,但仅仅是扩充,没有质的变化。保留了所有GB2312编码,在此基础上进行编码范围的扩充.容纳(包含特殊字符)共22014个字符编码。
GB18030编码是在GBK编码基础上的扩充,因为汉字更多,仅仅使用两位编码已经不能容纳要求的汉字,所以采用了2\4位混和的办法,可以支持更多的汉字编码。并且保留了原有的GBK 2字节编码兼容GB2312和gbk编码的文件。大概容纳55657个编码(包含特殊字符)。
GB2312编码重点总结如下 GB2312能完美的支持简体中文和英文,一个中文文字占用2个字节,一个英文字母同样占用2个字节。 问题产生了:在没有安装IE的简体中文支持的电脑上看GB2312编码的网页,其中中文都会是乱码,比如一位英国人在伦敦浏览你的网页,看到的除了英文字母正常外其他的都会是乱七八糟,就像火星文。
UTF-8
UTF-8是unicode,可以看作是大字符集,它包含了大部分文字的编码。为表达更多的文字,UTF-8采用2/3混编的方式。目前所容纳的汉字范围小于GBK编码。
UTF-8重点总结如下 UTF-8能完美的支持英文和中文,甚至其他文,一个中文文字占用3个字节,一个英文字母同样占用1个字节。
使用UTF-8的一个最大好处是其他地区的用户(如美国、印度、台湾)无需安装IE的简体中文支持就能正常观看你的文字而不会出现乱码。通常网络传输也是用UTF-8编码。
5.FIGlet示例
$ figlet -f acrobatic Rexdf
o__ __o o o__ __o
<| v\ <|> /v v\
/ \ <\ < \ /> <\
\o/ o/ o__ __o \o o/ o__ __o/ \o
|__ _<| /v |> v\ /v /v | |>_
| \ /> // <\/> /> / \ |
<o> \o \o o/ o/\o \ \o/ <o>
| v\ v\ /v __o /v v\ o | |
/ \ <\ <\/> __/> /> <\ <\__ / \ / \
$ figlet -f catwalk Rexdf
_/////// _// _//
_// _// _// _/
_// _// _// _// _// _//_/_/ _/
_/ _// _/ _// _/ _// _// _// _//
_// _// _///// _// _/ _/ _// _//
_// _// _/ _/ _// _/ _// _//
_// _// _//// _// _// _// _// _//
$ figlet -f cosmike Rexdf
:::::::.. .,:::::: .,:: .::::::::-. .-:::::'
;;;;``;;;; ;;;;'''' `;;;, .,;; ;;, `';,;;;''''
[[[,/[[[' [[cccc '[[,,[[' `[[ [[[[[,,==
$$$$$$c $$"""" Y$$$P $$, $$`$$$"``
888b "88bo,888oo,__ oP"``"Yo, 888_,o8P' 888
MMMM "W" """"YUMMM,m" "Mm, MMMMP"` "MM,
$ figlet -f doh Re
RRRRRRRRRRRRRRRRR
R::::::::::::::::R
R::::::RRRRRR:::::R
RR:::::R R:::::R
R::::R R:::::R eeeeeeeeeeee
R::::R R:::::R ee::::::::::::ee
R::::RRRRRR:::::R e::::::eeeee:::::ee
R:::::::::::::RR e::::::e e:::::e
R::::RRRRRR:::::R e:::::::eeeee::::::e
R::::R R:::::Re:::::::::::::::::e
R::::R R:::::Re::::::eeeeeeeeeee
R::::R R:::::Re:::::::e
RR:::::R R:::::Re::::::::e
R::::::R R:::::R e::::::::eeeeeeee
R::::::R R:::::R ee:::::::::::::e
RRRRRRRR RRRRRRR eeeeeeeeeeeeee
$ figlet -f isometric1 Rexdf
___ ___ ___ ___ ___
/\ \ /\ \ |\__\ /\ \ /\ \
/::\ \ /::\ \ |:| | /::\ \ /::\ \
/:/\:\ \ /:/\:\ \ |:| | /:/\:\ \ /:/\:\ \
/::\~\:\ \ /::\~\:\ \ |:|__|__ /:/ \:\__\ /::\~\:\ \
/:/\:\ \:\__\ /:/\:\ \:\__\ ____/::::\__\ /:/__/ \:|__| /:/\:\ \:\__\
\/_|::\/:/ / \:\~\:\ \/__/ \::::/~~/~ \:\ \ /:/ / \/__\:\ \/__/
|:|::/ / \:\ \:\__\ ~~|:|~~| \:\ /:/ / \:\__\
|:|\/__/ \:\ \/__/ |:| | \:\/:/ / \/__/
|:| | \:\__\ |:| | \::/__/
\|__| \/__/ \|__| ~~
$ figlet -f smisome1 Rexdf
___ ___ ___ ___ ___
/\ \ /\ \ /\__\ /\ \ /\ \
/::\ \ /::\ \ |::L__L /::\ \ /::\ \
/::\:\__\ /::\:\__\ /::::\__\ /:/\:\__\ /::\:\__\
\;:::/ / \:\:\/ / \;::;/__/ \:\/:/ / \/\:\/__/
|:\/__/ \:\/ / |::|__| \::/ / \/__/
\|__| \/__/ \/__/ \/__/