前一段时间做了一个文件上传到FTP服务器的功能(使用org.apache.commons.net.ftp.FTPClient进行上传文件到FTP服务器),做的过程当中也遇到了和大家很多人都遇到过的问题:上传中文文件乱码问题,当时一通百度然后挨个挨个的试,最后使用了下面这两行代码解决了中文乱码问题,但是知其然并不知其所以然。最近正好不忙,所以了解了一下为什么使用这两行代码后上传中文文件就不乱码了。
ftpClient.sendCommand("OPTS UTF8", "ON");
ftpClient.storeFile(new String(fileName.getBytes("UTF-8"), "ISO-8859-1"), inputStream);
首先要明白两个编码,FTP协议的编码,FTP服务器的编码
**FTP协议编码:**指的是FTP传输协议所用的编码,默认为ISO-8859-1
**FTP服务器编码:**指的是所用的FTP服务器的编码(如UTF-8、GBK)
**源文件是通过FTP传输协议传输到FTP服务器的,而FTP传输协议所使用的编码是ISO-8859-1,所以在使用FTP协议传输之前需要先将文件名转码为ISO-8859-1再进行传输,当FTP服务器接收到上传的源文件之后同样会进行转码操作。**FTP服务器解码时使用的是自身的默认字符集(UTF-8或其他),所以我们要保证在上传文件对文件进行编码操作时使用的字符集要与FTP服务器使用的解码字符集保持一致。
/**
* 一次完整的转码操作要经过编码和解码
* java.lang.String#getBytes(java.lang.String) 使用命名的字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
* java.lang.String#String(byte[], java.nio.charset.Charset) 通过使用指定的字符集解码指定的字节数组,构造一个新的String。
*/
@Test
public void transcodingUtf8() throws UnsupportedEncodingException {
String string = "西红柿炒鸡蛋";
// UTF-8 --> ISO-8859-1
String iso88591String = new String(string.getBytes("UTF-8"), "ISO-8859-1");
// SO-8859-1 --> UTF-8
System.out.println(new String(iso88591String.getBytes("ISO-8859-1"), "UTF-8"));
}
Java中org.apache.commons.net.ftp.FTPClient
上传文件的大体流程和使用FTP客户端上传文件是差不多的。我们先来看一下当我们使用FTP客户端上传文件到FTP服务器的大体流程,看一看FTP客户端和FTP服务器都对文件名称做了什么样的处理(我这里的FTP客户端是Transmit,FTP服务器是vsftpd)。