Attualmente, tar codifica i nomi dei file in UTF
In realtà tar non codifica/decodifica affatto i nomi dei file, semplicemente li copia fuori dal filesystem così com'è. Se la tua locale è basata su UTF-8 (come in molte distribuzioni Linux moderne), sarà UTF-8. Sfortunatamente la codepage di sistema di una macchina Windows non è mai UTF-8, quindi i nomi saranno sempre alterati tranne che su strumenti come WinRAR che consentono di modificare il set di caratteri utilizzato.
Pertanto è impossibile creare un file ZIP con nomi di file non ASCII che funzionino con le versioni di Windows di diversi paesi e il loro supporto di cartelle compresse integrato.
È un difetto dei formati tar e zip che non ci sono informazioni di codifica fisse o fornite, quindi i caratteri non ASCII saranno sempre non portabili. Se hai bisogno di un formato di archivio non ASCII dovrai utilizzare uno dei formati più recenti, come il recente 7z o rar. Sfortunatamente questi sono ancora traballanti; in 7zip è necessario il -mcu
switch e rar continuerà a non utilizzare UTF-8 a meno che non rilevi caratteri non presenti nella codepage.
Fondamentalmente è un casino orribile e se puoi evitare di distribuire archivi contenenti nomi di file con caratteri non ASCII starai molto meglio.
Ecco un semplice script Python che ho scritto per decomprimere i file tar da UNIX su 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()
Il problema, usando in Linux il tar
predefinito (GNU tar), è risolto... aggiungendo il --format=posix
parametro durante la creazione del file.
Per esempio:
tar --format=posix -cf
In Windows, per estrarre i file, utilizzo bsdtar.
In https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html è scritto (dal 2005 !!):
> Ho letto qualcosa nel ChangeLog sul supporto di UTF-8. Cosa fa
> questo significa?
> Non ho trovato alcun modo per creare un archivio che fosse intercambiabile
> tra locali diversi.Quando si creano archivi in formato POSIX.1-2001 (tar --format=posix o --format=pax), tar converte i nomi dei file dalle impostazioni locali correnti in UTF-8 e quindi li memorizza nell'archivio. Durante l'estrazione, viene eseguita l'operazione inversa.
P.S. Invece di digitare --format=posix
puoi digitare -H pax
, che è più breve.