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解析器抱怨數據中的換行符而不是編碼本身 –