代码改变世界

让DrFTPd完美支持中文

2010-04-05 16:16  贼寇在何方  阅读(1066)  评论(0编辑  收藏  举报

DrFTPd服务端不支持中文,于是自己动手解决之:

DrFTPd服务端似乎用的ASCII编码,每当传输包含中文的文件或者创建中文目录的时候,就会出现乱码
查看master的日志,可以看到如下的片段:

DEBUG 31 三月 2010 23:56:37 [FtpConn thread 49 from 127.0.0.1 drftpd/drftpd] org.drftpd.master.BaseFtpConnection.service  - << CWD ····
后面是一串乱码····

有了这个线索,我们很轻松地在src\master\src\org\drftpd\master下找到了这个BaseFtpConnection.java。
在这里,我们花了不少时间,找到了setControlSocket方法。

方法内部在创建BufferedReader对象和BufferedOutputStream时,都用到了一个字符串“ISO-8859-1”。
谷歌一下,可知是基于ASCII的西欧语言的字符集。

接下来就是尝试了:
尝试使用“GBK”,发现有部分中文目录显示乱码
接着换用“GB2312”,FileZilla一切正常
为了支持非中文操作系统,最后还是决定尝试“UTF-8”。
结果让人有些失望,对FileZilla,FtpRush和FlashFxp的测试中,仅有FlashFxp强制设定使用UTF8时显示正常。

原因何在?
答案就在DrFTPd对客户端FEAT命令反馈中···

以下是DrFTPd对FTPRush的反馈
[1] FEAT
[1] 211-Extensions supported:
[1]  MLST type*,x.crc32*,size*,modify*,unix.owner*,unix.group*,x.slaves*,x.xfertime*
[1]  PRET
[1]  CLNT
[1]  NOOP
[1] 211 End

以下是G6FTPServer对FTPRush的反馈
[1] FEAT
[1] 211-Extensions supported:
[1]  AUTH TLS
··········(省略若干行)
[1]  TVFS
[1]  UTF8
[1]  XCRC "filename" SP EP
[1]  XMD5 "filename" SP EP
[1]  XSHA1 "filename" SP EP
[1] 211 End.

FEAT是用来请求FTP服务器列出它的所有的扩展命令的。此处DrFTPd没有把“UTF8”反馈给FTPRush,所以FTPRush没有以UTF-8的方式解读DrFTPd的List。

于是打开ftpcommand.conf
按照CLNT命令——UTF8和CLNT命令一样,只要反馈一条消息即可,不需要做更多事情,所以一样是“doDUMMY”——依样画葫芦,增加一条
UTF8{
plugin org.drftpd.commands.dummy
class Dummy
method doDUMMY
perms %
}

重启DrFTPd-Master服务,还是不行···
观察FTP记录,看到了:
[1] OPTS UTF8 ON
[1] 502 Command not implemented.
这就是说,FTPRush在得知服务端支持UTF-8时,会接着询问“UTF8是否启用?”。这时DrFTPd却回复了一个不支持该命令,这显然不行。
继续依样画葫芦,增加一条
OPTS {
plugin org.drftpd.commands.dummy
class Dummy
method doDUMMY
perms %
}

再次重启,一切OK,中文支持完美解决:
[1] OPTS UTF8 ON
[1] 200 Command okay