2017-09-01 78 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

我这一问题,我改变码头为另一个新的(相同的版本),以便病人,现在è没关系。但我不知道为什么我有这个问题。 –