Actualmente, tar codifica nombres de archivos en UTF
En realidad, tar no codifica ni decodifica los nombres de los archivos, simplemente los copia del sistema de archivos tal cual. Si su configuración regional está basada en UTF-8 (como en muchas distribuciones modernas de Linux), será UTF-8. Desafortunadamente, la página de códigos del sistema de un cuadro de Windows nunca es UTF-8, por lo que los nombres siempre se alterarán, excepto en herramientas como WinRAR que permiten cambiar el juego de caracteres.
Por lo tanto, es imposible crear un archivo ZIP con nombres de archivo que no sean ASCII que funcionen en las versiones de Windows de diferentes países y su compatibilidad integrada con carpetas comprimidas.
Es una deficiencia de los formatos tar y zip que no hay información de codificación fija o proporcionada, por lo que los caracteres que no son ASCII nunca serán portátiles. Si necesita un formato de archivo que no sea ASCII, tendrá que usar uno de los formatos más nuevos, como 7z reciente o rar. Desafortunadamente, estos todavía son inestables; en 7zip necesitas el -mcu
switch, y rar aún no usará UTF-8 a menos que detecte caracteres que no están en la página de códigos.
Básicamente, es un desastre horrible y si puede evitar la distribución de archivos que contienen nombres de archivo con caracteres que no son ASCII, estará mucho mejor.
Aquí hay una secuencia de comandos de Python simple que he escrito para descomprimir archivos tar de UNIX en 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()
El problema, usando en Linux el tar
por defecto (GNU tar), se soluciona... agregando el --format=posix
parámetro al crear el archivo.
Por ejemplo:
tar --format=posix -cf
En Windows, para extraer los archivos, uso bsdtar.
En https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html está escrito (desde 2005 !!):
> Leí algo en el ChangeLog sobre el apoyo de UTF-8. Que hace
> esto significa?
> No encontré forma de crear un archivo que fuera intercambiable
> entre diferentes locales.
Al crear archivos en formato POSIX.1-2001 (tar --format=posix o--format=pax), tar convierte los nombres de los archivos de las configuraciones regionales actuales a UTF-8 y luego los almacena en el archivo. Al extraer, se realiza la operación inversa.
PD En lugar de escribir --format=posix
puedes escribir -H pax
, que es más corto.