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.