Apache Commons ZipArchiveOutputStream se rompe al agregar nombres de archivo con caracteres no ASCII

Estoy usando un org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream para agregar archivos provenientes de un repositorio de Subversion. Esto funciona bien siempre que no use Umlauts alemanes (ä, ö, ü) ni ningún otro carácter especial en el nombre del archivo. Me pregunto cuál sería la forma más rápida de hacer que acepte caracteres no ASCII.

def zip(repo: SVNRepository, out: OutputStream, url: String, resourceList: Seq  
       [SVNResource]) {
  val zout = new ZipArchiveOutputStream(new BufferedOutputStream(out))
  zout.setEncoding("Cp437");
  zout.setFallbackToUTF8(true);
  zout.setUseLanguageEncodingFlag(true);
  zout.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE);
  try {
    for (resource <- resourceList) {
      addFileToStream(repo, zout, resource)
    }
  }
  finally {
    zout.finish
    zout.close
  }
}

private def addFileToStream(repo: SVNRepository, zout: ZipArchiveOutputStream, resource:SVNResource): ZipArchiveOutputStream = {
  val entry = resource.entry
  val url = YSTRepo.getAbsolutePath(entry)
  if (FILE == entry.getKind.toString) {
    val file = new File(url)
    val zipEntry = new ZipArchiveEntry(file, url)   
    zout.putArchiveEntry(zipEntry)
    val baos = new ByteArrayOutputStream()
    val fileprops = new SVNProperties()
    repo.getFile(url, -1, fileprops, baos)
    IOUtils.copy(new ByteArrayInputStream(baos.toByteArray), zout)
    zout.closeArchiveEntry
  } else if (DIR == entry.getKind.toString) {
    if (resource.hasChildren) {
      val dirProps = new SVNProperties()
      val entries = repo.getDir(url, -1, dirProps, new java.util.ArrayList[SVNDirEntry])
      for (child <- SVNResource.listDir(repo, entries.toList.asInstanceOf[Seq SVNDirEntry]])) {
        addFileToStream(repo, zout, child)
      }
    }
  }
  zout
}
Respuesta 1

Resolví el problema estableciendo

UnicodeExtraFieldPolicy.NOT_ENCODEABLE 

a

UnicodeExtraFieldPolicy.ALWAYS

Los nombres de archivo ahora se muestran correctamente usando Linux-Unzip, Windows-Compressed-Folders, IZArc y WINZIP.

Respuesta: 2

Según sus comentarios, parece que el verdadero problema es con el unzipprograma Linux y / o la codificación compatible con su sistema de archivos Linux. Una solución es pasar la -Uopción de descomprimir, que escapará a los caracteres Unicode en los nombres de archivo.

Dicho esto, también recomiendo eliminar las siguientes líneas cuando escribe su archivo ZIP:

zout.setEncoding("Cp437");
zout.setFallbackToUTF8(true);
zout.setUseLanguageEncodingFlag(true);

Y reemplácelos con lo siguiente:

zout.setEncoding("UTF-8");

Esto debería dar como resultado la mayor portabilidad.

Respuesta: 3

Heredé un archivo de licencia "XML" que no contiene ningún elemento raíz, sino más bien dos fragmentos XML (<XmlCreated> y <Product>), así que cuando intento analizar el archivo, (con expectativa) recibo un error sobre ...

Hay un jar que tiene 2 versiones en la versión 1, principalmente 2 clases Clase A Clase B La clase A tiene un constructor como A (X, B) en la versión 2, hay principalmente 2 clases y una interfaz Clase A ...

En primer lugar, soy nuevo en Java y Eclipse. En Visual Basic, agregaron una función que le permitía presionar el botón Ctrl para que el contenido de la ayuda sea transparente de forma temporal. Esto te permitió ...

Necesito analizar una expresión xpath para recuperar el nombre de nodo / atributo / predicado / etc. de la expresión para su posterior procesamiento. No me dirijo a un archivo xml específico. Para el xpath / root / nodeA [...