¿Cómo puedo descomprimir correctamente un archivo ZIP de archivos con nombres hebreos?


18

Alguien me envió un archivo ZIP que contiene archivos con nombres hebreos (y creado en Windows, no estoy seguro con qué herramienta). Yo uso LXDE en Debian Stretch. El administrador de archivos de Gnome logra descomprimir el archivo, pero los caracteres hebreos son confusos. Yo creo que estoy recibiendo UTF-8 octetos extendidas en caracteres Unicode, por ejemplo, tengo un archivo cuyo nombre tiene cuatro caracteres y un suffic .doc, y los personajes son: 0x008E 0x0087 0x0085 0x008E. El uso de la utilidad de descompresión de la línea de comandos es aún peor: se niega a descomprimirse por completo, quejándose de un "carácter multibyte o ancho inválido o incompleto".

Entonces, mis preguntas son:

  • ¿Hay otra utilidad de descompresión que descomprima mis archivos con los nombres correctos?
  • ¿Hay algo mal con la forma en que se comprimió el archivo, o es solo una incompatibilidad de las implementaciones ZIP? ¿O incluso error / error de las utilidades ZIP de Linux?
  • ¿Qué puedo hacer para obtener los nombres de archivo correctos después de haber descomprimido usando los ilegibles?

Si busca esos bytes en la tabla cp862, ¿el nombre del archivo coincide con lo que esperaba? De lo contrario, ¿conoce la codificación nativa de la máquina fuente?
Michael Homer

Lo mismo para cp1255 , y cualquier otra codificación plausible; puede ser posible resolverlo basándose en lo que parece correcto.
Michael Homer

@MichaelHomer: No, no parece que coincida. La codificación nativa de la máquina de origen es lo que MS Windows usa cuando establece la configuración regional en hebreo-israelí, por lo que supongo que a veces es UTF-8 y a veces CP1255.
einpoklum

Respuestas:


15

Parece que los nombres de los archivos están codificados en una de las páginas de códigos de propiedad de Windows ( CP862 , 1255 , etc.).

  • ¿Hay otra utilidad de descompresión que descomprima mis archivos con los nombres correctos? No conozco una utilidad zip que admita estas páginas de códigos de forma nativa. 7z tiene cierta comprensión de las codificaciones, pero creo que tiene que ser una codificación que su sistema conozca de manera más general (la elige configurando la LANGvariable de entorno) y las páginas de códigos de Windows probablemente no se encuentren entre ellas.

    unzip -UUdebería funcionar desde la línea de comandos para crear archivos con los bytes correctos en sus nombres (deshabilitando todo el soporte Unicode). Ese es probablemente el efecto que ya obtuvo de la herramienta de GNOME. La codificación no será correcta de ninguna manera, pero podemos solucionarlo a continuación.

  • ¿Hay algo mal con la forma en que se comprimió el archivo, o es solo una incompatibilidad de las implementaciones ZIP? ¿O incluso error / error de las utilidades ZIP de Linux? El archivo que le dieron no fue creado de forma portátil Eso no es necesariamente incorrecto para un uso interno donde la codificación es fija y conocida de antemano, aunque la especificación de formato dice que se supone que los nombres son UTF-8 o cp437 y los suyos tampoco. Incluso entre máquinas Windows, el uso de diferentes páginas de códigos no funciona bien, pero las máquinas que no son Windows no tienen un concepto de esas páginas de códigos para empezar. La mayoría de las herramientas UTF-8 codifican sus nombres de archivo (que todavía no siempre es suficiente para evitar problemas).

  • ¿Qué puedo hacer para obtener los nombres de archivo correctos después de haber descomprimido usando los ilegibles? Si puede identificar la codificación de los nombres de archivo, puede convertir los bytes de los nombres existentes en UTF-8 y mover los archivos existentes al nombre correcto. La convmvherramienta esencialmente resume ese proceso en un solo comando: convmv -f cp862 -t utf8 -r .intentará convertir todo dentro .de cp862 a UTF-8.

    Alternativamente, puede usar iconvy findmover todo a sus nombres correctos. Algo como:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    encontrará todos los archivos debajo del directorio actual e intentará convertir los nombres en UTF-8.

    En cualquier caso, puede experimentar con diferentes codificaciones e intentar encontrar una que tenga sentido.


Después de que haya arreglado la codificación por usted, si desea enviar estos archivos de vuelta en la otra dirección, es posible que tenga el mismo problema en el otro extremo. En ese caso, puede revertir el proceso antes de comprimir los archivos -UU, ya que es probable que sea muy difícil solucionarlo en Windows.


Supongo que esto tendrá que hacer ya que el archivo ZIP que estaba buscando ahora desapareció, bueno, por razones irrelevantes aquí. Gracias, lo haré la próxima vez y espero lo mejor.
einpoklum

1
raro p7zipnegarse a manejar archivos .zip. ¿Hay alguna manera de extraer un archivo con nombres de archivo en codificaciones propietarias, en Linux? Cuando extraigo con unzip, obtengo un error: "error: no se puede crear ╨и╨╕╨┐ / Ship_╨п ╨Я╤А╨╛╤З╨╗╨ ° ╨Я╤А╨╛ ╨н╤В╨╛ ╨ ▓╨Ю╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Nombre de archivo demasiado largo "
Nickolai Leschov

Me las arreglé para extraer el archivo .zip correctamente con LANG=ru_RU.CP1251; unzip Bleed.zip(fue codificación cirílica en mi caso). Ahora me pregunto cómo configuro mi sistema para poder abrir correctamente dichos archivos .zip en la GUI de forma predeterminada.
Nickolai Leschov

@NickolaiLeschov Haz una pregunta y alguien podrá ayudarte. Probablemente necesite proporcionar más información sobre su sistema.
Michael Homer

unzip -UU foo.ziptrabajó para los personajes turcos
Mert S. Kaplan

8

Tuve éxito con el comando 7z x <source.zip>.

Versión:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

Entorno potencialmente relevante:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

Fue capaz de descomprimir todos los archivos con caracteres de 8 bits en sus nombres de archivo, con algunos de estos caracteres omitidos, algunos confusos.


p7zip es el único que funcionó para mí
alex88

6

Acabo de tener el mismo problema, y ​​resulta que mi versión de unzipeso está disponible en los repositorios de Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) puede manejar la decodificación automática de nombres de archivos si especificas el -ainterruptor.

unzip -a stupid.zip

+1 aunque no tengo nada para probar esto ahora.
einpoklum

1
De acuerdo con la página del manual de unzipla -aconmutación se encarga de la conversión de archivos de texto. No nombres de archivo.
beruic

@beruic, había descomprimido números Unicode como nombres de archivo (# U + 0040 # U + 0050 ...), y luego "descomprimir -a" realmente ayudó.
Chang Zhao

1
Intenté esto en algún manga. Los nombres de archivo se decodificaron correctamente, pero las imágenes también se interpretaron como texto (!) Y se corrompieron por completo. Incluso interpreta archivos zip y rar dentro del archivo como texto, la detección es completamente inútil.
rjh

2

Tuve un problema similar con la decodificación de un archivo zip con caracteres cirílicos. Un script de python de una línea hizo el trabajo correctamente:

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

Entonces solo llámalo unzip_ency llámalounzip_enc ZIP_FILE [TARGET_DIR]

Para mí unzip -UU, unzip -ani LANG*las variables de entorno ni las de nada sirvieron.


Lo intentaré la próxima vez que tenga un archivo zip para extraer ... gracias. Pero, ¿podría cambiar su secuencia de comandos para: 1. verificar si hay dos argumentos 2. extraer al directorio de trabajo actual si solo se proporciona el archivo zip?
einpoklum

2

Tuve suerte con esta combinación:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

agregue --notest a convmv para cambiar el nombre real. Más tarde encontré una versión aún mejor:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest

+1 solo para convmv y la herramienta 7zip de línea de comandos.
einpoklum

Probablemente uno tiene que probar diferentes opciones para la LANGvariable y de codificación en función del archivo en cuestión. Tengo un archivo donde LANG=ru_RU.CP1251junto con -f cp866trabajado.
Dmitri Chubarov

0

Tengo el archivo comprimido comprimido en Linux (desde la línea de comandos) y los nombres de archivo con caracteres diacríticos no se descomprimen correctamente en Windows, pero lo descomprimí con éxito con el software Bandizip que puede establecer el juego de caracteres en la barra de herramientas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.