【问题标题】:JSch SFTP transfer changes encodingJSch SFTP 传输更改编码
【发布时间】:2015-10-06 21:40:08
【问题描述】:

我正在使用 JSch 使用以下代码将 UTF-8 编码的 XML 文件从运行 Bitvise SSH 服务器的 Windows 机器传输到我的 linux 机器 (Ubuntu) 上的本地目录:

// Open JSch session
JSch jsch = new JSch();
session = jsch.getSession("username", "host", 22);
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
session.setTimeout(5 * 60 * 1000);
session.connect();

// Open SFTP Connection
ChannelSftp sftpChannel = (ChannelSftp)session.openChannel("sftp");
sftpChannel.connect();

// Download the XML File to a local directory
byte[] buffer = new byte[1024];
final BufferedInputStream bis = new BufferedInputStream(sftpChannel.get("file.xml", new DeliveryProgressMonitor()));
final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));
int readCount = -1;

while( (readCount = bis.read(buffer)) > 0) {
    bos.write(buffer, 0, readCount);
}

// Closing + Cleanup of resources

我确认正在检索的文件以 UTF-8 格式存储在服务器上,没有 BOM,具有正确编码的 äöü 等字符。

使用上面的代码传输文件后,文件在目标机器上仍然是 UTF-8 编码(file -bi 输出 application/xml; charset=utf-8),但是查看文件的内容我可以看到 äöü 不是可读性更长,并已转换为ü等字符序列。

同样的问题也出现在来自

的示例程序中

http://www.jcraft.com/jsch/examples/Sftp.java.html

以及使用 scp 命令行时。

使用相同的 Java 代码将文件传输到我的运行 Windows 10 的开发机器上,可以保持文件完好无损。

无论客户端计算机上使用何种操作系统,如何确保编码保持不变?

【问题讨论】:

  • 很可能,一切正常;它是您用来查看目标计算机上文件的工具,这是问题所在。 ü 是当您将 UTF-8 序列视为 ISO 8859-1(或 Windows-1252)时看到的。您如何查看收到的文件的内容?
  • 感谢 VGR,这实际上是问题所在。原来我的 XML-Parser vi 使用的是 latin1 编码,而我的 xml-parser 抱怨的是数据中的换行符,而不是编码本身

标签: java utf-8 character-encoding sftp jsch


【解决方案1】:

正如 VGR 在上面的评论中指出的,传输工作正常,只是编辑器使用错误的编码打开文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2013-02-13
    • 2017-10-10
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多