- 论坛徽章:
- 0
|
前几天在我的年老体衰的toshiba L5上跑lfs,觉得有趣。进图形模式后感觉慢得难以忍受。后来无意中发现elinks不错,很小,很快。在文本模式下就能用。非常合我心意。可一试用,发现压根不支持中文。搜了几篇文章,试了一下,还是不行。最后看到有个兄弟自己写了个gbk码表,然后重新configure的办法貌似不错。试了一下。确实能用。不过一来无法支持UTF-8,二来看了下elinks代码。发现那个gbk码表其实从原理上说是支持不了的。至于为什么能用,没深入研究。
反正代码也看了,就继续钻研了一下。一开始打算自己写转码函数。在网上找算法的时候,无意中又发现有libiconv这个玩意儿。这东西真好,大包大揽,什么都搞定了,只要简单的几个函数调用就行了。很适合我这种懒人。赶紧下了下来试试。可以编译。把zhcon的源码也下了。现在环境置办齐了。可以开工了。
一开始以为挺简单,准备只要能出中文就行。后来发现elinks内部挺复杂。耦合性非常紧密,想改点什么挺不容易。过去也没有中文化的经验。一开始没想通为什么要转码。觉得很多余。人家网页标明了用GBK编码,那说明人家网页的内容就是GBK编码的。你还转什么呀。显示就结了呗。基于这个思想。把elinks的转码部分视为垃圾,去掉了。试了一下,在zhcon下显示基于GBK网页的中文没问题。但是不能换行。改了些代码,可以换行了。又发现google搜索出来的一些文章是乱码。一时没明白为什么。仔细研究了一下,发现这些网页都是utf-8编码的。退出zhcon,进入zhcon --utf8模式,这些网页能显示了。结果那些gbk网页又乱码了。这下终于明白转码的意义了。终端的char set是特定的,但是网页的char set各种各样,为了能够都在同一个终端下显示不同编码的网页,转码是必须的。重新回到转码问题上。经过两天两夜的阅读代码,查找资料。上解决了这个问题。libiconv挺好用。向开源社区的人们致敬!不过有些utf-8码流会被报告非法,用seamonkey这样的浏览器没见这种问题。但出现概率很低。
我仍然在elinks的Unicode目录下建立了一个gbk.cp文件,不过那个文件中没有实质性内容,是为了在codepages.inc中占一个表目才安置的。怕麻烦直接改codepages。inc也行。附件中是我生成的补丁。适用于elinks-0.11.6.其它版本没试过。基于libiconv-1.13.1。libiconv和zhcon的安装和编译方法请参照各自的官方网站上的说明。补丁的使用方法,由于我修改了Makefile.config文件,所以我的补丁必须是confgiure脚本运行过后才能生成。因此,你在使用补丁的时候,先展开elinks源码包,运行一遍configure。再打补丁。把补丁放在elinks源码目录下。执行
patch -p1 < elinks-0.11.6-gbk-utf8-line-split-SHAW.patch
即可。继续编译elinks。src目录下的elinks即为支持中文的执行程序。由于configure在不同环境下生成的makefile并不相同。所以如果你因为打了我的补丁而无法编译。也可以把原版elinks生成的Makefile.config文件在打补丁之前保存起来,然后补丁之后再复制回来。覆盖补丁之后的内容。打开Makefile.config文件,找到看起来像:
LIBS = -lX11 -lssl -lcrypto -ldl -lgpm -lz -lbz2 -lidn -lexpat
的一行,改为
LIBS = -lX11 -lssl -lcrypto -ldl -lgpm -lz -lbz2 -lidn -lexpat -liconv
后保存。前提条件是你打算编译elinks之前已经成功编译并安装了libiconv库。
我测试了几个网站,但并不广泛。有些网站的utf-8仍为乱码。原因是libiconv报告它们为非法字符流。具体原因我没有深入libiconv,所以并不清楚。大部分没有问题。测试最多的gbk网站是book.sina.com.cn,很完美。英文网站是www.kernel.org。这个版本的elinks理论上能够自动识别终端的能力,把其他类型的编码都自动像当前终端的char set转换。如果你发现不能自动转换。请用alt+s修改当前charset为gbk后保存设置。一般就没问题了。如果你的终端是UTF-8终端,也没问题。不需要明显进行什么设置,一切应该是自动的。关于这一点,我是用zhcon --utf8测试的。看起来没问题。
最后说说现存的问题:
有些UTF-8网站仍会有乱码。
中文断句,也就是自动换行功能实现得比较勉强。原有elinks的断句根本没考虑多字节编码情形。而且一律只从ascii的空格字符开始断句。因此原版的elinks是不能为中文网页自动换行的。修改了以后,发现,它经常把一个汉字拆成两半断句。造成第一行最后一个字和第二行整行都是乱码。后来我改进了汉字识别方法。这种概率大为降低,但是代价是,不能最大限度利用屏幕宽度。也就是说,它有时候会在屏幕中间断句,后面不显示。造成版面不美观。阅读密度下降。好处是空行多了以后眼睛不累。
如果大家喜欢,我会很开心。如果有什么疑问。请email至 shaofanfan@sohu.com 与我联系。
enjoy
附截图一张,这个是windows下用xmanager的终端运行elinks的效果。用zhcon运行的不会截图。zhcon的字体好看一些。
[ 本帖最后由 wilddingo 于 2009-8-11 19:12 编辑 ] |
|