Actuellement, tar encode les noms de fichiers en UTF
En fait, tar n'encode/décode pas du tout les noms de fichiers, il les copie simplement hors du système de fichiers tels quels. Si vos paramètres régionaux sont basés sur UTF-8 (comme dans de nombreuses distributions Linux modernes), ce sera UTF-8. Malheureusement, la page de code système d'une boîte Windows n'est jamais UTF-8, donc les noms seront toujours mutilés, sauf sur des outils tels que WinRAR qui permettent de modifier le jeu de caractères utilisé.
Il est donc impossible de créer un fichier ZIP avec des noms de fichiers non ASCII qui fonctionnent dans les versions de Windows de différents pays et leur prise en charge intégrée des dossiers compressés.
C'est une lacune des formats tar et zip qu'il n'y a pas d'informations de codage fixes ou fournies, de sorte que les caractères non ASCII seront toujours non portables. Si vous avez besoin d'un format d'archive non ASCII, vous devrez utiliser l'un des formats les plus récents, tels que le récent 7z ou rar. Malheureusement, ceux-ci sont encore bancaux; dans 7zip, vous avez besoin du -mcu
switch, et rar n'utilisera toujours pas UTF-8 à moins qu'il ne détecte des caractères qui ne se trouvent pas dans la page de code.
Fondamentalement, c'est un gâchis horrible et si vous pouvez éviter de distribuer des archives contenant des noms de fichiers avec des caractères non-ASCII, vous serez bien mieux lotis.
Voici un simple script Python que j'ai écrit pour décompresser les fichiers tar d'UNIX sous 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()
Le problème, en utilisant sous Linux le tar
par défaut (GNU tar), est résolu... en ajoutant le --format=posix
paramètre lors de la création du fichier.
Par exemple:
tar --format=posix -cf
Sous Windows, pour extraire les fichiers, j'utilise bsdtar.
Dans https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html il est écrit (depuis 2005 !!):
> J'ai lu quelque chose dans le ChangeLog sur le support de l'UTF-8. Que signifie
> ça veut dire ?
> Je n'ai trouvé aucun moyen de créer une archive qui serait interchangeable
> entre différents lieux.Lors de la création d'archives au format POSIX.1-2001 (tar --format=posix ou--format=pax), tar convertit les noms de fichiers des paramètres régionaux actuels en UTF-8, puis les stocke dans l'archive. Lors de l'extraction, l'opération inverse est effectuée.
PS Au lieu de taper --format=posix
vous pouvez taper -H pax
, qui est plus court.