GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa membuat zip / tgz di Linux sehingga Windows memiliki nama file yang tepat?

Saat ini, tar menyandikan nama file dalam UTF

Sebenarnya tar tidak menyandikan/mendekodekan nama file sama sekali, Ini hanya menyalinnya dari sistem file apa adanya. Jika lokal Anda berbasis UTF-8 (seperti di banyak distro Linux modern), itu akan menjadi UTF-8. Sayangnya halaman kode sistem kotak Windows tidak pernah UTF-8, jadi nama akan selalu dirusak kecuali pada alat seperti WinRAR yang memungkinkan rangkaian karakter dulu diubah.

Jadi, tidak mungkin membuat file ZIP dengan nama file non-ASCII yang berfungsi di berbagai rilis Windows di berbagai negara dan dukungan folder terkompresi bawaannya.

Ini adalah kekurangan dari format tar dan zip bahwa tidak ada informasi penyandian tetap atau disediakan, sehingga karakter non-ASCII akan selalu non-portabel. Jika Anda memerlukan format arsip non-ASCII, Anda harus menggunakan salah satu format yang lebih baru, seperti 7z atau rar terbaru. Sayangnya ini masih miring; di 7zip Anda membutuhkan -mcu beralih, dan rar masih tidak akan menggunakan UTF-8 kecuali ia mendeteksi karakter yang tidak ada di halaman kode.

Pada dasarnya ini adalah kekacauan yang mengerikan dan jika Anda dapat menghindari pendistribusian arsip yang berisi nama file dengan karakter non-ASCII, Anda akan jauh lebih baik.


Berikut adalah skrip Python sederhana yang saya tulis untuk mengekstrak file tar dari UNIX di 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()

Masalahnya, di Linux menggunakan tar default (GNU tar), diselesaikan ... menambahkan --format=posix parameter saat membuat file.

Sebagai contoh:
tar --format=posix -cf

Di Windows, untuk mengekstrak file, saya menggunakan bsdtar.

Di https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html tertulis (sejak 2005 !!):

> Saya membaca sesuatu di ChangeLog tentang dukungan UTF-8. Apa
> maksudnya ini?
> Saya tidak menemukan cara untuk membuat arsip yang dapat dipertukarkan
> antara lokal yang berbeda.

Saat membuat arsip dalam format POSIX.1-2001 (tar --format=posix atau--format=pax), tar mengonversi nama file dari lokal saat ini ke UTF-8, lalu menyimpannya dalam arsip. Saat mengekstraksi, operasi sebaliknya dilakukan.

P.S. Alih-alih mengetik --format=posix Anda dapat mengetikkan -H pax , yang lebih pendek.


Linux
  1. Bagaimana saya bisa membuat pohon direktori di C++/Linux?

  2. Bagaimana saya bisa menggunakan grep untuk hanya menampilkan nama file di Linux?

  3. Cara membuat arsip zip yang kompatibel dengan Linux dari sebuah direktori di Mac

  1. Cara Membuat File ZIP yang Dilindungi Kata Sandi di Linux

  2. Bagaimana saya bisa membuat file tar multipart di Linux?

  3. Bagaimana cara melindungi kata sandi file .tgz dengan tar di Unix?

  1. Cara membuat stik USB bootable Linux di Windows

  2. (C/C++) Bagaimana cara menghasilkan file yang dapat dieksekusi yang dapat berjalan di Windows dan Linux?

  3. Bagaimana saya bisa menginstal Windows 7 tanpa dvd atau usb, di linux?