Jak mogę poprawnie zdekompresować archiwum ZIP plików o hebrajskich nazwach?


18

Ktoś wysłał mi plik ZIP zawierający pliki o hebrajskich nazwach (i utworzony w systemie Windows, nie jestem pewien, z jakim narzędziem). Używam LXDE na Debian Stretch. Menedżerowi archiwum Gnome udało się rozpakować plik, ale hebrajskie znaki są zniekształcone. Wydaje mi się, że rozszerzam oktety UTF-8 na znaki Unicode, np. Mam plik, którego nazwa ma cztery znaki i .doc wystarczające, a znaki to: 0x008E 0x0087 0x008E 0x0085. Korzystanie z narzędzia do rozpakowywania wiersza poleceń jest jeszcze gorsze - odmawia całkowitej dekompresji, narzekając na „Nieprawidłowy lub niekompletny znak wielobajtowy lub szeroki”.

Tak więc moje pytania to:

  • Czy istnieje inne narzędzie do dekompresji, które rozpakuje moje pliki pod prawidłowymi nazwami?
  • Czy jest coś nie tak ze sposobem skompresowania pliku, czy jest to po prostu niezgodność implementacji ZIP? A może nawet błędne / błędne narzędzia Linux ZIP?
  • Co mogę zrobić, aby uzyskać poprawne nazwy plików po rozpakowaniu przy użyciu zniekształconych nazw plików?

Jeśli spojrzysz na te bajty w tabeli cp862, czy nazwa pliku będzie zgodna z oczekiwaniami? W przeciwnym razie, czy znasz natywne kodowanie maszyny źródłowej?
Michael Homer

To samo dotyczy cp1255 i wszelkich innych możliwych kodowań; możliwe jest po prostu wypracowanie tego w oparciu o to, co wygląda dobrze.
Michael Homer

@MichaelHomer: Nie, to nie wygląda tak, jakby pasowało. Natywne kodowanie maszyny źródłowej jest tym, czego używa MS Windows, gdy ustawiasz ustawienia regionalne na hebrajski-Izrael, więc myślę, że czasami to UTF-8, a czasem CP1255.
einpoklum

Odpowiedzi:


15

Wygląda na to, że nazwy plików są zakodowane na jednej z zastrzeżonych stron kodowych systemu Windows ( CP862 , 1255 itp.).

  • Czy istnieje inne narzędzie do dekompresji, które rozpakuje moje pliki pod prawidłowymi nazwami? Nie znam narzędzia zip, które natywnie obsługuje te strony kodowe. 7z ma pewną wiedzę na temat kodowania, ale uważam, że musi to być kodowanie, o którym Twój system wie bardziej ogólnie (wybierasz go, ustawiając LANGzmienną środowiskową), a stron kodowych Windows prawdopodobnie nie ma wśród nich.

    unzip -UUpowinien działać z wiersza poleceń, aby tworzyć pliki z poprawnymi bajtami w swoich nazwach (poprzez wyłączenie obsługi wszystkich znaków Unicode). Jest to prawdopodobnie efekt, który już uzyskałeś z narzędzia GNOME. Kodowanie nie będzie poprawne, ale możemy to naprawić poniżej.

  • Czy jest coś nie tak ze sposobem skompresowania pliku, czy jest to po prostu niezgodność implementacji ZIP? A może nawet błędne / błędne narzędzia Linux ZIP? Podany plik nie został utworzony przenośnie. Niekoniecznie jest to niewłaściwe w przypadku użytku wewnętrznego, w którym kodowanie jest ustalone i znane z góry, chociaż specyfikacja formatu mówi, że nazwy mają być UTF-8 lub CP437, a twoje nie są. Nawet między komputerami z systemem Windows używanie różnych stron kodowych nie działa dobrze, ale maszyny z systemem innym niż Windows nie mają pojęcia o tych stronach kodowych na początek. Większość narzędzi UTF-8 koduje nazwy plików (co wciąż nie zawsze wystarcza, aby uniknąć problemów).

  • Co mogę zrobić, aby uzyskać poprawne nazwy plików po rozpakowaniu przy użyciu zniekształconych nazw plików? Jeśli potrafisz zidentyfikować kodowanie nazw plików, możesz przekonwertować bajty istniejących nazw na UTF-8 i przenieść istniejące pliki na właściwą nazwę. Narzędzie zasadniczo owija się ten proces do jednego polecenia: spróbuje przekonwertować wszystko wewnątrz od cp862 na UTF-8.convmvconvmv -f cp862 -t utf8 -r ..

    Alternatywnie możesz użyć iconvi findprzenieść wszystko do ich poprawnych nazw. Coś jak:

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

    znajdzie wszystkie pliki w bieżącym katalogu i spróbuje przekonwertować nazwy na UTF-8.

    W obu przypadkach możesz eksperymentować z różnymi kodowaniami i próbować znaleźć takie, które ma sens.


Po poprawieniu kodowania, jeśli chcesz wysłać te pliki z powrotem w innym kierunku, możliwe jest, że będziesz miał ten sam problem na drugim końcu. W takim przypadku możesz odwrócić proces przed skompresowaniem plików -UU, ponieważ prawdopodobnie będzie to bardzo trudne do naprawienia po stronie systemu Windows.


Myślę, że to będzie musiało wystarczyć, ponieważ plik ZIP, którego szukałem, zniknął z, no cóż, powodów nieistotnych tutaj. Dzięki, zrobię to następnym razem i mam nadzieję na najlepsze.
einpoklum

1
rarlub p7zipodmówić obsługi archiwów .zip. Czy istnieje sposób na wyodrębnienie archiwum z nazwami plików w zastrzeżonych kodowaniach w systemie Linux? Podczas wypakowywania za pomocą unzippojawia się błąd: „błąd: nie można utworzyć ╨и╨╕╨┐ / Ship_╨п ╨Я╤А╨╛╤З╨╗╨░ ╨Я╤А╨╛ ╨н╤В╨╛ ╨ ▓╨Ю╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Nazwa pliku za długa ”
Nickolai Leschov

Udało mi się poprawnie wyodrębnić plik .zip LANG=ru_RU.CP1251; unzip Bleed.zip(w moim przypadku było to kodowanie cyrylicy). Teraz zastanawiam się, jak skonfigurować system, aby domyślnie poprawnie otwierać takie pliki .zip w GUI?
Nickolai Leschov

@NickolaiLeschov Zadaj pytanie, a ktoś może ci pomóc. Prawdopodobnie będziesz musiał podać więcej informacji o swoim systemie.
Michael Homer

unzip -UU foo.zippracował dla tureckich postaci
Mert S. Kaplan

8

Miałem sukces z dowództwem 7z x <source.zip>.

Wersja:

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

Potencjalnie istotne środowisko:

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

Był w stanie zdekompresować wszystkie pliki zawierające 8-bitowe znaki w nazwach plików, niektóre z nich zostały pominięte, a niektóre zniekształcone.


p7zip jest jedynym, który dla mnie działał
alex88

6

Właśnie miałem ten sam problem i okazuje się, że moja wersja unziptego jest dostępna z repozytoriów Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) może obsługiwać automatyczne dekodowanie nazw plików, jeśli podasz -aprzełącznik.

unzip -a stupid.zip

+1, chociaż nie mam teraz z tym nic do przetestowania.
einpoklum

1
Według stronę man unzipz -aprzełącznikiem dba o konwersji plików tekstowych. Nie nazwy plików.
beruic

@beruic, rozpakowałem numery Unicode jako nazwy plików (# U + 0040 # U + 0050 ...), a potem „unzip -a” naprawdę pomogło.
chang zhao

1
Próbowałem tego na jakiejś mandze. Nazwy plików zostały poprawnie zdekodowane, ale obrazy zostały również zinterpretowane jako tekst (!) I całkowicie uszkodzone. Nawet interpretuje pliki zip i rar w archiwum jako tekst, wykrywanie jest całkowicie bezużyteczne.
rjh

2

Miałem podobny problem z dekodowaniem archiwum zip ze znakami cyrylicy. Jednowierszowy skrypt Pythona poprawnie wykonał zadanie:

#!/usr/bin/python

import zipfile
import sys

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

Następnie po prostu zadzwoń unzip_enci zadzwońunzip_enc ZIP_FILE [TARGET_DIR]

Dla mnie ani unzip -UU, unzip -aani LANG*zmienne środowiskowe zrobiła niczego dobrego.


Spróbuję następnym razem, gdy będę miał taki plik zip do wyodrębnienia ... dzięki. Ale - czy możesz zmienić skrypt, aby: 1. sprawdzić, czy istnieją dwa argumenty 2. wypakować do bieżącego katalogu roboczego, jeśli dostarczony jest tylko plik zip?
einpoklum,

2

Miałem szczęście z tą kombinacją:

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

dodaj --notest do convmv dla faktycznej zmiany nazwy. Później znalazłem jeszcze lepszą wersję:

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

+1 tylko dla convmv i wiersza polecenia 7zip.
einpoklum

Prawdopodobnie trzeba wypróbować różne opcje dla LANGzmiennej i od kodowania w zależności od pliku pod ręką. Mam plik, w którym LANG=ru_RU.CP1251razem z nim -f cp866pracowałem.
Dmitrij Chubarow,

0

Mam skompresowane archiwum zip w systemie Linux (z wiersza poleceń), a nazwy plików ze znakami diakrytycznymi nie są poprawnie dekompresowane w systemie Windows, ale pomyślnie rozpakowałem je za pomocą oprogramowania Bandizip , które może ustawić kodowanie znaków na pasku narzędzi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.