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的开发计算机,可使文件保持不变。
无论客户端机器上使用哪种操作系统,我如何确保编码保持不变?
在所有的可能性编辑器,一切正常;它是您用来在目标机器上查看问题文件的工具。当您将UTF-8序列视为ISO 8859-1(或Windows-1252)时,您会看到''''''。你如何查看收到的文件的内容? – VGR
谢谢VGR,那真的是问题所在。原来,我的XML-Parser vi使用的是latin1编码,而我的xml解析器抱怨数据中的换行符而不是编码本身 –