Obecnie tar koduje nazwy plików w UTF
W rzeczywistości tar w ogóle nie koduje / dekoduje nazw plików, po prostu kopiuje je z systemu plików bez zmian. Jeśli twoje ustawienia regionalne są oparte na UTF-8 (jak w wielu współczesnych dystrybucjach Linuksa), będzie to UTF-8. Niestety systemowa strona kodowa okna systemu Windows nigdy nie ma formatu UTF-8, więc nazwy zawsze będą zniekształcone, z wyjątkiem narzędzi takich jak WinRAR, które pozwalają na zmianę zestawu znaków.
Dlatego niemożliwe jest utworzenie pliku ZIP z nazwami plików spoza ASCII, które działają w wersjach systemu Windows w różnych krajach i mają wbudowaną obsługę folderów skompresowanych.
Wadą formatów tar i zip jest to, że nie ma ustalonych lub dostarczonych informacji o kodowaniu, więc znaki spoza ASCII zawsze będą nieprzenośne. Jeśli potrzebujesz formatu archiwum spoza ASCII, musisz użyć jednego z nowszych formatów, takich jak najnowszy 7z lub rar. Niestety są one nadal dziwne; w 7zip potrzebujesz -mcu
przełącznika, a rar nadal nie będzie używał UTF-8, chyba że wykryje znaki spoza strony kodowej.
Zasadniczo jest to okropny bałagan i jeśli możesz uniknąć dystrybucji archiwów zawierających nazwy plików ze znakami spoza ASCII, będziesz znacznie lepiej.
Oto prosty skrypt w języku Python, który napisałem w celu rozpakowania plików tar z systemu UNIX w systemie Windows:
źródło
Problem, przy użyciu domyślnego systemu Linux
tar
(tar GNU), został rozwiązany ... dodając--format=posix
parametr podczas tworzenia pliku.Na przykład:
tar --format=posix -cf
W systemie Windows do wyodrębnienia plików używam bsdtar .
W https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html jest napisane (od 2005 roku !!):
PS Zamiast pisać
--format=posix
, możesz pisać-H pax
, co jest krótsze.źródło
Uważam, że masz problemy z samym formatem kontenera Zip. Smoła może cierpieć na ten sam problem.
Zamiast tego użyj formatu archiwum 7zip (
.7z
) lub RAR (.rar
). Oba są dostępne dla systemu Windows i Linux;p7zip
oprogramowanie obsługuje oba formaty.I właśnie przetestowane wykreowanie
.7z
,.rar
,.zip
oraz.tar
pliki na obu WinXP i Debian 5, a.7z
i.rar
przechowywać pliki / przywracania prawidłowej nazwy plików podczas gdy.zip
i.tar
pliki nie. Nie ma znaczenia, który system zostanie użyty do utworzenia archiwum testowego.źródło
Miałem problemy z rozpakowywaniem
tar
izip
plikami otrzymywanymi od użytkowników systemu Windows. Chociaż nie odpowiadam na pytanie „jak utworzyć archiwum, które będzie działać”, poniższe skrypty pomagają poprawnie rozpakować plikitar
izip
niezależnie od oryginalnego systemu operacyjnego.UWAGA: trzeba dostosować źródło kodujący ręcznie (
cp1251
,cp866
w przykładach poniżej). Opcje linii poleceń mogą być dobrym rozwiązaniem w przyszłości.Smoła:
Zamek błyskawiczny:
UPD 2018-01-02 : Używam
chardet
pakietu do odgadnięcia poprawnego kodowania surowej porcji danych. Teraz skrypt działa od razu na wszystkich moich złych archiwach, a także na dobrych.Ważne uwagi:
chardet
nie działa z normalnym obiektem Unicode).Wersja ostateczna:
źródło
POSIX-1.2001 określił, w jaki sposób TAR używa UTF-8.
Od 2007 r. Dziennik zmian wersja 6.3.0 w PKZIP APPNOTE.TXT ( http://www.pkware.com/documents/casestudies/APPNOTE.TXT ) określa, w jaki sposób ZIP używa UTF-8.
Pozostaje tylko otwarte pytanie, które narzędzia prawidłowo obsługują te standardy.
źródło