作者:mgmonster | 来源:互联网 | 2023-07-16 13:22
如题,或者说 FTP 服务端编码不确定的情况下如何保证不会乱码
吾辈在项目中使用
连接 SFTP,然而使用
获取文件列表中的中文文件名都乱码了,而且参数为中文文件名的时候会直接抛出异常
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| package com.zx.idc.common.ftp.sftp;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Properties;
import java.util.Vector;
import java.util.stream.Collectors;
/**
* @author rxliuli
*/
public class SftpTest {
private final Logger log = LoggerFactory.getLogger(getClass());
@Test
public void ls() {
final JSch jSch = new JSch();
ChannelSftp sftp = null;
Session session = null;
try {
session = jSch.getSession("rxliuli", "localhost", 22);
session.setPassword("123456");
final Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect();
log.info("JSch open ssh session successful: {}", session);
sftp = (ChannelSftp) session.openChannel("sftp");
sftp.connect();
/*
如果使用 GBK 抛出异常
com.jcraft.jsch.SftpException: The encoding can not be changed for this sftp server.
*/
sftp.setFilenameEncoding("UTF-8");
log.info("Sftp connection successful: {}", sftp);
/*
结果是:
TestSftpDir
.xsd
Ŀ¼
*/
final Vector list = sftp.ls("/");
log.info("list: \n{}", list.stream().map(ChannelSftp.LsEntry::getFilename).collect(Collectors.joining("\n")));
/*
抛出异常:
com.jcraft.jsch.SftpException: No such file
*/
try {
sftp.ls("/测试中文目录");
} catch (SftpException sftpException) {
sftpException.printStackTrace();
}
/*
也会抛出异常:
com.jcraft.jsch.SftpException: No such file
*/
try {
sftp.ls(new String("/测试中文目录".getBytes("GBK"), "ISO-8859-1"));
} catch (SftpException sftpException) {
sftpException.printStackTrace();
}
} catch (Throwable e) {
log.error("sftp operation failed: {}", e);
throw new RuntimeException(e);
} finally {
if (sftp != null && sftp.isConnected()) {
sftp.disconnect();
}
if (session != null && session.isConnected()) {
session.disconnect();
}
}
}
} |
已经尝试的解决方案有:
- 使用
1
| sftp.setFilenameEncoding("UTF-8"); |
设置文件名编码为
:实测无效
- 使用
1
| sftp.setFilenameEncoding("GBK"); |
:抛出异常
1
| com.jcraft.jsch.SftpException: The encoding can not be changed for this sftp server. |
- 使用
1
| sftp.ls(new String("/测试中文目录".getBytes("GBK"), "ISO-8859-1")) |
编码文件名,抛出异常
1
| com.jcraft.jsch.SftpException: No such file |
有人遇到过这种问题么?