2015-10-06 127 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工作正常,它只是使用了錯誤的編碼打開文件