V současné době tar kóduje názvy souborů v UTF
Ve skutečnosti tar nekóduje/dekóduje názvy souborů vůbec, pouze je zkopíruje ze souborového systému tak, jak jsou. Pokud je vaše národní prostředí založené na UTF-8 (jako v mnoha moderních linuxových distribucích), bude to UTF-8. Bohužel systémová kódová stránka boxu Windows není nikdy UTF-8, takže názvy budou vždy pozměněny, s výjimkou nástrojů, jako je WinRAR, které umožňují změnu znakové sady.
Je tedy nemožné vytvořit soubor ZIP s názvy souborů, které nejsou ASCII a které by fungovaly ve verzích systému Windows v různých zemích a jejich vestavěná podpora komprimovaných složek.
Nedostatkem formátů tar a zip je to, že neexistují žádné pevné nebo dodávané informace o kódování, takže znaky jiné než ASCII budou vždy nepřenosné. Pokud potřebujete archivní formát jiný než ASCII, budete muset použít některý z novějších formátů, například nedávný 7z nebo rar. Naneštěstí jsou tyto stále nemotorné; v 7zip potřebujete -mcu
přepínač a rar stále nebude používat UTF-8, pokud nezjistí znaky, které nejsou v kódové stránce.
V podstatě je to hrozný nepořádek a pokud se můžete vyhnout distribuci archivů obsahujících názvy souborů s jinými znaky než ASCII, budete na tom mnohem lépe.
Zde je jednoduchý skript Pythonu, který jsem napsal pro rozbalení souborů tar z UNIXu ve Windows:
import tarfile
archive_name = "archive_name.tar"
def recover(name):
return unicode(name, 'utf-8')
tar = tarfile.open(name=archive_name, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
m.name = recover(m.name)
updated.append(m)
tar.extractall(members=updated)
tar.close()
Problém je v použití výchozího tar
v Linuxu (GNU tar), je vyřešeno... přidáním --format=posix
parametr při vytváření souboru.
Například:
tar --format=posix -cf
Ve Windows k extrahování souborů používám bsdtar.
V https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html je napsáno (od 2005 !!):
> Četl jsem něco v ChangeLog o podpoře UTF-8. Co dělá
> to znamená?
> Nenašel jsem způsob, jak vytvořit archiv, který by byl zaměnitelný
> mezi různými lokalitami.Při vytváření archivů ve formátu POSIX.1-2001 (tar --format=posix nebo--format=pax) tar převede názvy souborů z aktuálních lokalit na UTF-8 a poté je uloží do archivu. Při extrakci se provede obrácená operace.
P.S. Místo psaní --format=posix
můžete zadat -H pax
, která je kratší.