2017-09-01 116 views
1

我有一個unziping xml簽名的問題,它被改變了。解壓XML文本內容損壞

客戶端發送此XML:

<DatoAdicional> 
     <Codigo>03</Codigo> 
     <Valor>: REGULARIZACI�N DEL VALOR FACTURADO*: DEBE SER: 30.29*: VALOR FACTURADO: 30.00*</Valor> 
    </DatoAdicional> 

但當unziping我們得到(它改變):

<DatoAdicional> 
    <Codigo>03</Codigo> 
    <Valor>: REGULARIZACI???N DEL VALOR FACTURADO*: DEBE SER: 30.29*: VALOR FACTURADO: 30.00*</Valor> 
</DatoAdicional> 

的問題是,當它解壓的服務器碼頭內,因爲當拉鍊被解壓的帶一個Java客戶端,它已經成功地取消了。我的代碼java是:

public static List<ZipContent> getXml(DataHandler file) throws IOException { 
    ZipInputStream zis = null; 
    List<ZipContent> zipContents = new ArrayList<>(); 
    try { 
     zis = new ZipInputStream(file.getInputStream()); 
     for (ZipEntry ze = zis.getNextEntry(); ze != null; ze = zis.getNextEntry()) { 
      if (!ze.isDirectory()) { 
       byte[] buffer = new byte[1 << 11]; 
       ByteArrayOutputStream byteArrayOs = new ByteArrayOutputStream(); 
       int len; 
       while ((len = zis.read(buffer)) > 0) { 
        byteArrayOs.write(buffer, 0, len); 
       } 
       ZipContent zc = new ZipContent(); 
       zc.setFileName(ze.getName()); 
       zc.setXml(new String(byteArrayOs.toByteArray())); 
       zipContents.add(zc); 
      } 
      zis.closeEntry(); 
     } 
     zis.close(); 
     return zipContents; 
    } catch (IOException e) { 
     throw e; 
    } 
} 

Hepl me please。

+1

不知道如何/爲什麼碼頭適合這個問題。示例代碼中沒有任何內容使用servlet規範或jetty中的任何內容。 –

+0

因爲這個方法在從另一個客戶端調用時解壓得很好,那麼我認爲這可能是因爲Jetty –

回答

1

new String(byteArrayOs.toByteArray())使用系統的默認編碼從字節數組中創建一個字符串。在Windows系統上,這很可能是例如cp1252(在德國系統上,你的可能會有所不同)。我不知道類ZipContent,但是您可以設置字節而不是將其轉換爲文本,或者通過使用正確的字符集來使用正確的字符集。 new String(byteArrayOs.toByteArray(), "utf8")

+0

Mi應用程序在centos服務器上。我做了改變,但我仍然有類似的錯誤,現在我們得到: \t \t \t \t \t \t \t \t \t \t \t \t :REGULARIZACIñDEL VALOR FACTURADO *:德貝SER:30.29 *:VALOR FACTURADO:30.00 * \t \t \t \t \t

+0

我這一問題,我改變碼頭爲另一個新的(相同的版本),以便病人,現在è沒關係。但我不知道爲什麼我有這個問題。 –