Como descomprimir corretamente um arquivo ZIP de arquivos com nomes hebraicos?

18

Alguém me enviou um arquivo ZIP contendo arquivos com nomes hebraicos (e criados no Windows, sem saber com qual ferramenta). Eu uso o LXDE no Debian Stretch. O gerenciador de arquivamentos do Gnome consegue descompactar o arquivo, mas os caracteres hebraicos são ilegíveis. Eu acho que estou obtendo octetos UTF-8 estendidos em caracteres Unicode, por exemplo, eu tenho um arquivo cujo nome tem quatro caracteres e uma suficiência .doc, e os caracteres são: 0x008E 0x0087 0x008E 0x0085. O uso do utilitário de descompactação da linha de comando é ainda pior - ele se recusa a descompactar completamente, reclamando de um "caractere amplo ou multibyte inválido ou incompleto".

Então, minhas perguntas são:

  • Existe outro utilitário de descompactação que descompactará meus arquivos com os nomes corretos?
  • Há algo de errado com a forma como o arquivo foi compactado ou é apenas uma incompatibilidade de implementações ZIP? Ou até falha / bug dos utilitários ZIP do Linux?
  • O que posso fazer para obter os nomes de arquivos corretos depois de ter descompactado usando os ilegíveis?
einpoklum
fonte
Se você procurar esses bytes na tabela cp862 , o nome do arquivo corresponde ao que você espera? Caso contrário, você conhece a codificação nativa da máquina de origem?
Michael Homer
O mesmo vale para cp1255 e quaisquer outras codificações plausíveis; pode ser possível resolvê-lo com base no que parece certo.
Michael Homer
@MichaelHomer: Não, não parece que coincide. A codificação nativa da máquina de origem é o que o MS Windows usa quando você define as configurações regionais para Hebraico-Israel, então acho que às vezes é UTF-8 e às vezes CP1255.
Einpoklum

Respostas:

15

Parece que os nomes de arquivos estão codificados em uma das páginas de código proprietárias do Windows ( CP862 , 1255 , etc.).

  • Existe outro utilitário de descompactação que descompactará meus arquivos com os nomes corretos? Não conheço um utilitário zip que ofereça suporte a essas páginas de código nativamente. O 7z tem algum entendimento sobre codificações, mas acredito que deve ser uma codificação que seu sistema conheça de maneira mais geral (você escolhe definindo a LANGvariável de ambiente) e as páginas de código do Windows provavelmente não estão entre elas.

    unzip -UUdeve funcionar na linha de comando para criar arquivos com os bytes corretos em seus nomes (desativando todo o suporte a Unicode). Esse é provavelmente o efeito que você já obteve da ferramenta do GNOME. A codificação não será correta de qualquer maneira, mas podemos corrigir isso abaixo.

  • Há algo de errado com a forma como o arquivo foi compactado ou é apenas uma incompatibilidade de implementações ZIP? Ou até falha / bug dos utilitários ZIP do Linux? O arquivo que você recebeu não foi criado portably. Isso não é necessariamente errado para um uso interno em que a codificação é corrigida e conhecida com antecedência, embora a especificação de formato diga que os nomes devam ser UTF-8 ou cp437 e o seu também. Mesmo entre máquinas Windows, o uso de diferentes páginas de código não funciona bem, mas as máquinas que não são Windows não têm conceito dessas páginas de código para começar. A maioria das ferramentas UTF-8 codifica seus nomes de arquivos (o que nem sempre é suficiente para evitar problemas).

  • O que posso fazer para obter os nomes de arquivos corretos depois de ter descompactado usando os ilegíveis? Se você conseguir identificar a codificação dos nomes de arquivos, poderá converter os bytes nos nomes existentes em UTF-8 e mover os arquivos existentes para o nome correto. A convmvferramenta basicamente agrupa esse processo em um único comando: convmv -f cp862 -t utf8 -r .tentará converter tudo dentro .do cp862 para UTF-8.

    Como alternativa, você pode usar iconve findmover tudo para os nomes corretos. Algo como:

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

    encontrará todos os arquivos abaixo do diretório atual e tentará converter os nomes em UTF-8.

    Em ambos os casos, você pode experimentar diferentes codificações e tentar encontrar uma que faça sentido.


Depois de corrigir a codificação, se você quiser enviar esses arquivos de volta na outra direção, é possível que você tenha o mesmo problema do outro lado. Nesse caso, você pode reverter o processo antes de compactar os arquivos -UU, pois provavelmente será muito difícil de corrigir no final do Windows.

Michael Homer
fonte
Acho que isso terá que ser feito, já que o arquivo ZIP em que eu estava analisando agora se foi por, bem, razões irrelevantes aqui. Obrigado, farei isso da próxima vez e espero o melhor.
Einpoklum
1
rarou se p7ziprecusar a manipular arquivos .zip. Existe uma maneira de extrair um arquivo com nomes de arquivos em codificações proprietárias, no Linux? Quando extraio com unzip, recebo um erro: "erro: não é possível criar ╨╕╨┐и╨╕╨┐ / Ship_╨п ╨Я╤А╨╛╤З╨╗╨░ ╨Я╤А╨╛ ╨н╤В╨╛ ╨ File ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Nome do arquivo muito longo "
Nickolai Leschov 13/01
Eu consegui extrair o arquivo .zip corretamente com LANG=ru_RU.CP1251; unzip Bleed.zip(era codificação cirílica no meu caso). Agora, pergunto-me como configuro meu sistema para que eu possa abrir corretamente esses arquivos .zip na GUI por padrão?
Nickolai Leschov
@NickolaiLeschov Faça uma pergunta e alguém poderá ajudá-lo. Você provavelmente precisará fornecer mais informações sobre seu sistema.
Michael Homer
unzip -UU foo.ziptrabalhou para caracteres turcos
Mert S. Kaplan
8

Eu tive sucesso com o comando 7z x <source.zip>.

Versão:

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

Ambiente potencialmente relevante:

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

Ele foi capaz de descompactar todos os arquivos com caracteres de 8 bits em seus nomes de arquivos, com alguns desses caracteres ignorados, outros ilegíveis.

vszakats
fonte
p7zip é o único que trabalhou para mim
alex88 14/03
6

Acabei de ter o mesmo problema, e acontece que minha versão unzipdisponível nos repositórios Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) pode lidar com decodificação automática de nomes de arquivos se você especificar a -aopção.

unzip -a stupid.zip
Igor Zinov'yev
fonte
+1, embora eu não tenha nada para testar isso agora.
einpoklum
1
De acordo com a página do manual, unzipo -aswitch cuida da conversão de arquivos de texto. Não nomes de arquivos.
beruic
@beruic, eu tinha descompactado números unicode como nomes de arquivo (# U + 0040 # U + 0050 ...) e, em seguida, "descompactar -a" realmente ajudou.
chang zhao 20/01
1
Eu tentei isso em alguns mangás. Os nomes dos arquivos foram decodificados corretamente, mas as imagens também foram interpretadas como texto (!) E corrompidas completamente. Ele até interpreta arquivos zip e rar dentro do arquivo como texto, a detecção é completamente inútil.
rjh 4/06
2

Eu tive um problema semelhante ao decodificar um arquivo zip com caracteres cirílicos. Um script python de uma linha fez o trabalho corretamente:

#!/usr/bin/python

import zipfile
import sys

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

Então é só ligar unzip_ence ligarunzip_enc ZIP_FILE [TARGET_DIR]

Para mim unzip -UU, unzip -anem LANG*as variáveis ​​de ambiente nem fizeram algum bem.

Iskren Ivov Chernev
fonte
Vou tentar na próxima vez que tiver um arquivo zip para extrair ... obrigado. Mas - você pode alterar seu script para: 1. verificar se há dois argumentos 2. extrair para o diretório de trabalho atual se apenas o arquivo zip for fornecido?
einpoklum 02/02
2

Eu tive sorte com esta combinação:

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

add --notest para convmv para renomear real. Mais tarde eu achei uma versão ainda melhor:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest
asdjfiasd
fonte
+1 apenas para convmv e a ferramenta 7zip da linha de comando.
einpoklum 19/02
Provavelmente, é preciso tentar opções diferentes para LANGvariável e de codificação, dependendo do arquivo em questão. Eu tenho um arquivo onde, LANG=ru_RU.CP1251juntamente com -f cp866trabalhou.
Dmitri Chubarov 29/04
0

Eu tenho um arquivo compactado no Linux (a partir da linha de comando) e os nomes de arquivos com caracteres diacríticos não são descompactados corretamente no Windows, mas eu o descompactei com êxito com o software Bandizip , que pode definir o conjunto de caracteres na barra de ferramentas.

Miro Junker
fonte