一、问题现象:Android端用Java写的代码,将本地文件通过FTP上传到vsftp服务器,文件名中的中文显示乱码。
二、问题定位:
1)首先要知道,FTP传输协议中,默认编码方式为ISO-8856-1。不管本地中文编码采用什么方式,最终上传到FTP前,必须要统一转成ISO-8856-1,这样FTP服务器才能正常还原出原来的编码方式。
2)客户端编码方式要和服务器的编码方式完全一致。比如服务器一般都是设置为UTF-8来支持中文,那么客户端也要使用UTF-8。
3)使用FileZilla客户端,查看对应FTP服务器字符集设置
然后用FileZilla直接连接下,注意控制台窗口中的打印信息,
注意,不同的vsftp,对于UTF8命令支持情况不同。vsftp V2.X版本是支持的,但到了vsftp V3.X就不支持了。因此强烈建议不要使用网上普遍说的,根据FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON")的返回值来判断是否设置本地编码为UTF-8。正确的做法是,将服务器的编码方式直接设置为UTF-8,然后强制客户端侧使用UTF-8。
三、解决办法:
1、将服务器的编码方式直接设置为UTF-8。具体不展开,网上查查即可。
2、文件名编码方式:filename = new String(filename.getBytes(“UTF-8”),“ISO-8856-1”);
3、ftpClient.setControlEncoding(LOCAL_CHARSET);
4、FileZilla客户端,字符集强制使用UTF-8。