Rexdf

The devil is in the Details.

figlet中文支持--Cygwin实现

| Comments

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.效果

先上两张图片来说明 cygwin

cygwin

2.程序调用图

cygwin

3.修改过程简记

待我修改完整,并把UTF-8字体也转化一个之后,整理好自定义字体转化工具后会发布一个github。 基本上完全按照王璐就可以很好地解决了,只是现在问题还不是很完美。所以暂时还不公布代码

4.编码问题

先上图说明一个我遇到的问题,因为我系统是因为所以我一直以为gcc提示本身是英文的,今天才发现,当我在右键Options里面Text–>Locale:zh_CN;Character set GBK;然后cygwin的各个命令全部变成中文了;不过运行octopress则如下的错误。显然我需要不停地改设置来运行不同的程序了。 cygwin 当然应该有一个解决方案就是把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   /::\  \   /::\  \
 /::\:\__\ /::\:\__\ /::::\__\ /:/\:\__\ /::\:\__\
 \;:::/  / \:\:\/  / \;::;/__/ \:\/:/  / \/\:\/__/
  |:\/__/   \:\/  /   |::|__|   \::/  /     \/__/
   \|__|     \/__/     \/__/     \/__/

Comments