GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso creare un zip / tgz in Linux in modo tale che Windows abbia nomi di file corretti?

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.


Linux
  1. Come posso creare un albero di directory in C++/Linux?

  2. Come posso usare grep per mostrare solo i nomi dei file su Linux?

  3. Come creare un archivio zip compatibile con Linux di una directory su un Mac

  4. Come posso creare un file tar multipart in Linux?

  5. Come posso installare Windows 7 senza dvd o usb, su Linux?

6 funzionalità che Windows 10 ha preso da Linux

Come installare i pacchetti .tar.gz o .tgz in Linux

Come eseguire Windows 95 su Linux

Come creare una chiavetta USB avviabile di Windows 10 in Linux

Come creare file zip o directory protetti da password in Linux

Come creare un USB avviabile da Windows su Linux