免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7732 | 回复: 6
打印 上一主题 下一主题

[桌面系统] Elinks支持中文的补丁(GBK,UTF-8) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-11 17:16 |只看该作者 |倒序浏览
前几天在我的年老体衰的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 编辑 ]

snapshot.JPG (375.68 KB, 下载次数: 32)

snapshot.JPG

elinks-0.11.6-gbk-utf8-line-split-SHAW.patch.bz2

31.89 KB, 下载次数: 186

论坛徽章:
0
2 [报告]
发表于 2009-08-12 15:54 |只看该作者
好东东啊,正在使用中。建议发到 http://elinks.or.cz/,给官方采纳

论坛徽章:
0
3 [报告]
发表于 2009-08-19 16:58 |只看该作者
已经使用,谢谢你的工作。

刚把JS支持也编译进去了,elinks越来越好用了。

一个问题:
自己编译的elinks(ver 0.11.6)中的线都变成字母了,pppppppppppppppppp或者其他啥的,哪里设置还是编译时要注意?
把unstable的 0.12下来编译了下,patch直接打上应该没有work。不过倒是发现里面的线工作正常了。

LZ应该研究过源代码了,不知道console 画线是哪部份的功能,这个问题困扰我很久了。我的终端设置应该是OK的。

[ 本帖最后由 可可火山 于 2009-8-20 12:38 编辑 ]

0.11.6_ch_ok_line_not.JPG (120.92 KB, 下载次数: 21)

0.11.6_ch_ok_line_not.JPG

0.12_ch_not_line_ok.JPG (104.25 KB, 下载次数: 22)

0.12_ch_not_line_ok.JPG

论坛徽章:
0
4 [报告]
发表于 2009-08-21 00:08 |只看该作者
其实,那个补丁我并未广泛测试过,不过我用来上的网站一般都ok。所以没太在意。我注意到你好像是用putty作为终端的。所以我特意也用putty试了一下。没发现你说的问题。我的可以显示线条。btw,我用netmanager也试过,也没问题。然后,我看到你上的是chinaunix的论坛,所以我用的也是chinaunix。附个截图。顺便传上我编译的二进制版本,你可以下载比较测试一下。另外,对于不想自己编译的懒人,也可以试试直接使用。不过那些库我就不上传了,里面有些链接,处理起来麻烦。
再顺便一句,你遇到的问题很有可能和你使用的中文终端有关。你应该多试验几个,以排除这个可能。或者换用不同版本的putty

[ 本帖最后由 wilddingo 于 2009-8-21 00:19 编辑 ]

截图.JPG (281.32 KB, 下载次数: 26)

截图.JPG

elinks.rar

1.02 MB, 下载次数: 100

论坛徽章:
0
5 [报告]
发表于 2009-08-21 10:33 |只看该作者
谢谢你花了这么多时间看我的问题。

画线的问题我找到原因了。在设置中
elinks -->Setup --> Terminal options. check "Switch fonts for line drawing"
后就可以了。

你的elinks我下了,好像有些lib我没,等下装上看看。
[frank@CentOS ~]$ ldd elinks
        linux-gate.so.1 =>  (0x008e5000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0x002cc000)
        libssl.so.4 => not found//我的是libssl.so.6
        libcrypto.so.4 => not found//我的是libcrypto.so.6
        libdl.so.2 => /lib/libdl.so.2 (0x00958000)
        libgpm.so.1 => /usr/lib/libgpm.so.1 (0x007eb000)
        libz.so.1 => /usr/lib/libz.so.1 (0x0095e000)
        libbz2.so.1 => /usr/lib/libbz2.so.1 (0x00295000)
        libidn.so.11 => /usr/lib/libidn.so.11 (0x00d03000)
        libexpat.so.0 => /lib/libexpat.so.0 (0x07f5b000)
        libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x00110000)
        libc.so.6 => /lib/libc.so.6 (0x003cf000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0x001ee000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x001f1000)
        /lib/ld-linux.so.2 (0x00627000)
        libm.so.6 => /lib/libm.so.6 (0x001f7000)


不过我的elinks可能还有点小小的问题:就是可能“中文断句还行”有问题,你好像也提到过了。线画出来了,不过好像没对好。补丁是按照你的步骤来的,不过打的时候好像有些错误信息。当时编译过了就没管。

Putty中关于Line drawing 的设置。 回去我看看其他软件。


[ 本帖最后由 可可火山 于 2009-8-21 11:42 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-08-23 22:27 |只看该作者
相当不错的,支持,刚刚搜了下elinks,果然是好东东,呵呵

论坛徽章:
0
7 [报告]
发表于 2009-10-22 09:54 |只看该作者
楼主,能不能打一个deb包上来啊,如果那样就好了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP