Categories

让 Linux 下的 FTP 服务器支持 GBK 编码

encoding在 Linux 中使用 UTF-8 作为 locale 已经成为理所当然的事,而 Linux 下的许多 FTP server 并不会处理文件名的编码,因此 UTF-8 的 locale 使得 FTP 服务里的文件名编码也是 UTF-8 的,原本都使用 UTF-8 是一个很好的解决方案,也是一个大趋势,然而 Windows 下有许多程序却只支持 GBK 这一系列的编码,或者是根本没有考虑编码的问题,因此也只能处理 Windows 默认的 GBK 编码了。所以在 Linux 下架设的 FTP 服务器让使用 Windows 的朋友来访问的话,中文可能会出现乱码,就显得不太友好了。为此也有不少解决方案,其中包括针对 vsftpd 的补丁,可以进行编码转换。然而这个补丁对于现在的 vsftpd 的版本来说有点老了,而且在 64 位的系统下面的错误:

500 OOPS: trunc_len not smaller than alloc_bytes in str_trunc

没有办法使用。后来找到了另一个解决办法,是基于文件系统的,不用打补丁,而且所有的 ftp 服务器都可以用。这就是使用 fuse-convmvfs 来虚拟一个文件系统。fuse-convmvfs 可以创建一个目录的镜像,在这个镜像里面的文件名都是经过 iconv 进行编码转换的结果,在底层则完全是同一个目录。例如:

convmvfs /home/ftp/gbk -o srcdir=/home/ftp/utf-8,icharset=utf8,ocharset=gbk,allow_other,uid=0,gid=11

则将 /home/ftp/gbk 作为 /home/ftp/utf-8 的一个镜像,只是在 /home/ftp/gbk 里面这些文件的名字“看起来是 GBK 编码的”,这样,只要把 FTP 的根目录指向这个镜像,那样 Windows 用户登录上来就不会看到乱码了。 🙂

原本打算直接使用这个镜像作为根目录,因为在 Linux 下的一些客户端也是支持 GBK 编码的 server 的,比如,在 ~/.lftp/rc 里写上:

set ftp:charset "GBK"

就可以处理那些 Windows 下的 GBK 编码的服务器。不过在这里却不适用,按照 lftp 的帮助:

This setting is only used when the server does not support UTF8.

这里的 FTP 服务器自己觉得是 UTF-8 的,只是实际上被底层文件系统摆了一道,出来的是 GBK 编码的文件名而已,所以 lftp 太智能了,登录上去看到的是乱码。最后我干脆就在 ftp 的根目录下面放了两个子目录:utf-8 和 gbk ,Windows 用户请使用 gbk 目录,Linux 用户请使用 utf-8 目录。 :-/

ps: FUSE 看起来好像会很好玩的样子。 🙂
pps: SourceForge 的新界面很漂亮啊!几次我都以为自己走错路了。 :p

12 comments to 让 Linux 下的 FTP 服务器支持 GBK 编码

  • transtone

    2.10以前的vsftpd都是需要打补丁才支持utf8和gbk的转换的,但自从升级到>=vsftpd-2.10,这个问题自动解决了,也不需要在配置文件中进行任何设置,用ie登陆也不会出现乱码了。俺用的是gentoo,不清楚是源代码中解决的还是portage打的补丁。

  • @transtone
    我这边 2.1.0 似乎还是乱码的,估计你用的高版本的 IE 能支持 UTF-8 编码吧?

  • transtone

    @pluskid
    IE6.0算不得高版本吧。那可能是gentoo整合了转码的patch。

  • transtone

    有图有真相:http://twitpic.com/bbsq1

  • pure-ftpd才是王道

  • @adoal
    仰慕豆叔,不过我现在是只要啥能用,用上了就懒得换了,以后如果出了啥问题就考虑下 pure-ftpd 。

  • 啊,今天用上了 convmvfs o.o

  • Tag FS 会比较实用好玩,但是做到存许多文件效率还可以的话技术难度不小的样子,从大一的时候就开始时不时 yy 这个想法,却总是觉得太麻烦或者效果不会好就不敢动手 -.-

    • 我也 yy 这个想法很多年了,一开始是不知道有 fuse 这个东西,觉得实现起来会比较麻烦,但是现在我更多的顾虑是觉得这个东西可能没有想象中的那么好用。打 tag 什么的,最后肯定越来越乱了,乱成一团,还不如简单的路径来得方便了。

      当然,如果是某些自动 tag 还是可以考虑的,比如 YYYY/MM/DD/ 就表示某个日期的所有文件,之类的,但是也还是觉得用途不大吧。

      • 比如图片,有从不同网站上下载回来的,可以按 by_site/[site_domain]/… 这样来存,也可以 by_category/[category_name]/… 这样,或者是 by_date/… ,有多种分类需求的情况下,Tag 挺合适的

        • 原来你有这样的需求啊,我的话,照片肯定是按照日期存放的,普通图片肯定是按照类别存放的,不会有其他索引方式。

          感觉少量的文件,其实怎么索引都无所谓,但是反过来大量的文件的话,tagged fs 的实现可能效率上反而又成问题了。