2015-10-06 105 views
1

我使用JSch从Windows计算机上运行Bitvise SSH服务器到我的Linux机器使用下面的代码(Ubuntu的)上的本地目录转移的UTF-8编码的XML文件:JSch SFTP转移改变编码

// 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 

我验证了正在检索的文件存储在服务器上没有BOM的UTF-8中,正确编码了像äöü这样的字符。

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

同样的问题也与示例性程序中发生从

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

以及使用scp命令线时。

使用相同的Java代码将文件传输到运行Windows 10的开发计算机,可使文件保持不变。

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

+0

在所有的可能性编辑器,一切正常;它是您用来在目标机器上查看问题文件的工具。当您将UTF-8序列视为ISO 8859-1(或Windows-1252)时,您会看到''''''。你如何查看收到的文件的内容? – VGR

+0

谢谢VGR,那真的是问题所在。原来,我的XML-Parser vi使用的是latin1编码,而我的xml解析器抱怨数据中的换行符而不是编码本身 –

回答

0

正如上述转让评论所指出的VGR工作正常,它只是使用了错误的编码打开文件