QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2386|回复: 5

基于gtk2编译的gftp2.0.14的中文支持基本完成

[复制链接]
发表于 2002-12-14 01:47:16 | 显示全部楼层 |阅读模式
有兴趣的朋友可以看看:

rpm包可以在这里下载:
http://211.95.164.49/linuxcn/soft/temp/gftp-2.0.14-1.i386.rpm
修改过的源码可以在这里下载:
http://211.95.164.49/linuxcn/soft/temp/gftp-2.0.14.tar.bz2

已经源码中改过的地方加上简单注释,在源码里搜索"llc_hack"这个关键字就能找到修改过的地方,建议用kate阅读源码
修改过的源码文件为:
src/gtk/misc-gtk.c
src/gtk/rename_dialog.c
src/gtk/transfer.c
src/gtk/bookmarks.c
src/gtk/view_dialog.c
lib/protocols.c
lib/config_file.c
lib/misc.c

非常感谢翔羽兄弟,和他的一番关于gtk2程序里的中文显示的讨论和试验,获益非浅

原来的gftp2.0.14(基于gtk2)的不兼容中文现象:
对于普通的中文文件(目录)名无法操作,表现为,(无论远程还是本地)中文目录可以显示,但不能进入,重命名和删除,更不能下载;但对于以utf-8编码的中目录(譬如glade2建立的中文目录)可以正常显示和进入;书签和以前版本不兼容,表现为,你以前书签(收藏夹)里的中文项目无法显示,但对于utf-8的能正常显示;可以建立中文目录,但建立的是乱码(其实是utf-8编码),可以新建中文标签,但新建的utf-8编码格式;用查看功能查看文件时,如果被查看文件有普通的中文内容则无法显示或显示错误,但对于utf-8编码的中文内容(譬如gedit默认就保存文件为utf-8编码)能正常显示;保存在config文(~/.gftp/gftprc),log文件(~/.gftp/gftp.log)里的中文信息全用utf-8编码,用普通的文本编辑工具打开乱码,但用gedit打开正常

分析原因:
1.通过和翔羽的讨论,证实gtk2的程序内部处理是用utf-8编码,也就是说,如果你要在gtk2程序里显示"中文"这样的中文字样,得先将"中文"这两字的当前locale编码,也就是gb编码,通过一个g_locale_to_utf8函数转成utf-8编码("中文"两字的gb to utf8编码为"涓?枃")发给程序,才能正确显示.gtk2这样做,大概是为了方便统一处理各种不同编码信息的显示吧.基于gtk2的gedit默认保存成utf-8编码,在它的保存设置选项里,可以见到关于保存为utf-8编码项的描述信息为"faster",大概就因为gedit内部用的就是utf8编码,保存时不需转换,因此才快一点
utf-8编码应该算是大势所趁吧,但和gb编码不兼容,因此utf-8编码的信息在gb locale下显示乱码,除非你用支持utf-8编码的工具去浏览,譬如gedit
2.一般情况下,我们在gb locale下建立的中文信息都为gb编码,譬如中文文件名,中文目录名,中文的txt文本,这些都是以gb编码记录在磁盘上,如果要在gtk2程序里显示,得转换成utf-8编码.gftp作者在lib/protocols.c中的gftp_get_next_file函数里获取本地(远程)文件信息时将非utf-8编码的文件(目录)(fle->file)转换成utf-8编码然后保存回fle->file这个变量里,因此可以在本地(远程)文件列表框里正常显示中文,但作者没有考虑gftp的其他操作都是以fle->file为对象操作的,结果就造成中文对象不存在的错误信息,譬如,有一个叫"中文"的目录,本来cd的操作应该是执行"cd 中文"命令,作者这么一转换,实际上执行的是"cd 涓?枃"的命令,当然对象就不存在;同样道理,删除,重命名,修改权限这些操作,一碰上中文的就通通错误.建立中文目录时,由于gtk2默认是utf-8编码,作者只考虑将非utf-8编码转换成utf-8编码,却没有考虑反转换的问题,结果"mkdir 中文"的指令就变成了"mkdir 涓?枃"的指令,也就是说,建立的目录乱码(但在gftp里显示正常,因为它支持utf-8编码显示);
中文书签无法显示也是这个原因引起的,因为原来版本的gftp是基于gtk1.2的,它保存的中文书签都是gb编码,无法直接显示

解决方法:
由于很多操作都是直接或间接对fle->file这个变量操作,因此选择了在gftp_get_next_file函数里不转换成utf-8编码而在需要显示的地方才转换成utf-8编码的方法;这样因为fle->file没有被转换,那些就能对所有的对象(包括中文对象)进行直接操作了;当然,牵一发动全身,改动了这个后,很多地方地方本来直接显示的,现在都得转成utf-8编码才能正确显示;而那些建立目录,或重命名的操作,也得用g_locale_from_utf8函数反转换成gb编码操作,才能备免产生乱码;简单点说,就是在相应的地方使用g_locale_to_utf8和g_locale_from_utf8这两个编码转换函数

经过上述修改,改正后的版本现在对中文文件(目录)的操作(包括建立和重命名)和一般显示已经完全没问题,对中文书签的添加和显示也基本没问题,对上一版本gftp建立的中文书签的兼容没问题,查看功能现在无论查看的是gb编码内容还是utf-8编码内容都能正确显示,设置文件和log文件里的中文信息的编码为gb(和上一版本兼容,方便查看).修改过的这个gftp,基本上已经可以像上一版本的gftp那样正常操作了

已知残留未解决问题:
1.菜单上的"日志"-"查看日志"功能失效,无法查看日志内容,这个是我将log内容的编码改为gb后引起的
2.路径显示栏无法正确显示带中文信息的路径,也不能通过输入中文路径回车来进入(原来就不行,这个不是我搞的)
3.书签里如果有中文书签,当先选编辑功能,然后按"保存"按钮,将发现列出来的书签里多出原来的中文书签,譬如你原来有
"哈哈"
"你好"
test
这三个书签,按上述操作后,将变成:
"哈哈"
"你好"(前面这两个是重复部分,其实是没有的,不过只是显示错误,对真正保存在磁盘上的收藏夹不受影响,你关闭gftp再运行就正确了)
"哈哈"
"你好"
test
已经知道第1和第3错误是在hack完以后出现的,有得有失的道理在这里得到明显的体现,不过,由于功力有限,我无法修正这三个错误.哪位朋友有兴趣就完善一下吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2002-12-14 12:52:04 | 显示全部楼层
其实搞这个没有多大的实用意义,因为加--disable-gtk20参数编译出来的基于gtk1.2版本的gftp2.0.14对中文支持可以说是完美了,但基于gtk2程序是大势所趋,无论以后是其他gtk2程序还是自己编写gtk2程序,都会遇上上述的中文化问题,都得考虑这些编码兼容的问题
我搞这个的主要目的是练手,增加经验值(呵呵,增长了不少)
回复

使用道具 举报

 楼主| 发表于 2002-12-16 15:32:04 | 显示全部楼层
刚修正设置窗口里设置"开始目录"里的中文路径显示和进去的问题,上述地址的源码暂时就不更新了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2003-5-2 11:16:08 | 显示全部楼层
下载不了呀  
回复

使用道具 举报

 楼主| 发表于 2003-5-2 15:40:29 | 显示全部楼层
早删掉了,改得不好
回复

使用道具 举报

发表于 2003-5-8 12:34:54 | 显示全部楼层
有没有人向ftp提交bug report啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 00:03 , Processed in 0.041391 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表