Categories

Calendar

November 2018
M T W T F S S
« Jun    
 1234
567891011
12131415161718
19202122232425
2627282930  

让 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 编码

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>