当前位置:编程学习 > JAVA >>

sftp遍历中文文件名乱码

最近项目要实现SFTP功能,选择了JSCH的包,如果上传的文件路径中如果包含中文,使用ChannelSftp的ls方法列出目录下的所有文件信息时,就会出现乱码,谁遇到相同情况的,如果有解决方法,请告诉下,不胜感激! 

--------------------编程问答-------------------- 根据格式需要,转码 --------------------编程问答--------------------

ChannelSftp channel=(ChannelSftp)session.openChannel("sftp");
channel.connect();

//...

InputStream in = new InputStreamReader(channel.getInputStream(), "UTF-8");


上面的UTF-8,是编码集。 
要看你们远程机器用的是什么了。
--------------------编程问答-------------------- 我做了个测试,代码是这样的,我按照ftp的方式,做了转换,没有任何作用,测试代码如下:
package test;
import java.util.Properties;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.ChannelSftp.LsEntry;



public class TestSftp {
public static void main(String[] args) {
JSch jsch = new JSch();
        Session sshSession;
try {
sshSession = jsch.getSession("impsv", "10.20.59.84", 22);
sshSession.setTimeout(500000);
System.out.println("Session created.");
        sshSession.setPassword("56rt%^RT");
        Properties sshConfig = new Properties();
        sshConfig.put("StrictHostKeyChecking", "no");
        sshSession.setConfig(sshConfig);
        sshSession.connect();
        System.out.println("Session connected.");
        Channel channel = sshSession.openChannel("sftp");
        channel.connect();
        System.out.println("Opening Channel.");
        ChannelSftp sftp = (ChannelSftp) channel;
        String remotePath="/home/impsv/allTempMedia/666666/jiekou/111.xml";
        int index = remotePath.lastIndexOf("/");
            Vector<LsEntry> vector = sftp.ls(remotePath.substring(0, index));
           sftp.setTerminalMode("binary".getBytes());
           //sftp.setFilenameEncoding("utf-8");
           
            for (LsEntry lsEntry : vector) {
             System.out.println(new String(lsEntry.getFilename().getBytes("ISO-8859-1"),"GBK"));
             //System.out.println(lsEntry.getFilename());
  if(lsEntry.getFilename().equals(remotePath.substring(index+1, remotePath.length())))System.out.println("1");;
            }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        

}
}
--------------------编程问答-------------------- 你知道你linux系统的编码集吗?
我觉得你们linux编码集是什么,下面这句就该设什么。
sftp.setFilenameEncoding("utf-8");

试下这样的组合?
1)
sftp.setFilenameEncoding("utf-8");
System.out.println(new String(lsEntry.getFilename().getBytes("utf-8"),"GBK"));

2)
sftp.setFilenameEncoding("utf-8");
System.out.println(lsEntry.getFilename()); --------------------编程问答-------------------- sftp.setFilenameEncoding("utf-8");

这种方法根本就不存在,不会的不要误导人 --------------------编程问答--------------------
引用 5 楼  的回复:
sftp.setFilenameEncoding("utf-8");

这种方法根本就不存在,不会的不要误导人

不好意思。我在网上找的javadoc。

http://epaul.github.com/jsch-documentation/易做图.javadoc/com/jcraft/jsch/ChannelSftp.html#setFilenameEncoding(java.lang.String)

ChannelSftp类是有这个setFilenameEncoding方法的呀。。
如果我的回帖伤害到了你,只能说声对不起了。 --------------------编程问答--------------------
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,