Pengkodean charset apa yang digunakan untuk nama file dan jalur di Linux?

45

Apakah ini tergantung pada sistem file apa yang saya gunakan? Sebagai contoh, ext2 / ext3 / ext4 tetapi juga apa yang terjadi ketika saya memasukkan salah satu CD-ROM "joliet" dengan ISO 9660? Saya pernah mendengar bahwa POSIX berisi semacam spesifikasi untuk pengkodean nama file charset?

Pada dasarnya, apa yang saya pikirkan adalah jika saya mendapatkan nama file yang dikodekan UTF-8, pengolahan / peliputan apa yang perlu saya lakukan sebelum saya meneruskannya ke file I / O API di Linux?

martin
sumber
Jawaban di bawah ini mengatakan bahwa OS dan sistem file tidak peduli tentang penyandian. Beberapa sistem file, seperti HFS +, sangat peduli. HFS +, saya percaya, membutuhkan UTF-8, yang dikonversi secara internal ke dialek terbatas UTF-16. NTFS juga memiliki masalah serupa tapi saya tidak jelas detailnya.
zmccord
HFS + juga mensyaratkan bahwa nama harus diurai yang tidak cocok dengan kecenderungan linux untuk menggunakan yang sudah diuraikan. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Jawaban:

49

Seperti dicatat oleh orang lain, sebenarnya tidak ada jawaban untuk ini: nama file dan jalur tidak memiliki penyandian; OS hanya menangani urutan byte. Aplikasi individual dapat memilih untuk menafsirkannya sebagai dikodekan dalam beberapa cara, tetapi ini bervariasi.

Secara khusus, Glib (digunakan oleh aplikasi Gtk +) mengasumsikan bahwa semua nama file dikodekan UTF-8, terlepas dari lokal pengguna . Ini mungkin ditimpa dengan variabel lingkungan G_FILENAME_ENCODING dan G_BROKEN_FILENAMES .

Di sisi lain, Qt default untuk mengasumsikan bahwa semua nama file dikodekan dalam lokal pengguna saat ini . Aplikasi individual dapat memilih untuk mengesampingkan asumsi ini, meskipun saya tidak tahu ada yang melakukannya, dan tidak ada sakelar penggantian eksternal.

Distribusi Linux modern diatur sedemikian rupa sehingga semua pengguna menggunakan lokal UTF-8 dan jalur pada mount sistem file asing diterjemahkan ke UTF-8, sehingga perbedaan dalam strategi ini umumnya tidak berpengaruh. Namun, jika Anda benar-benar ingin aman, Anda tidak dapat mengasumsikan struktur apa pun tentang nama file di luar "diakhiri NUL, '/' - urutan byte yang dibatasi".

(Perhatikan juga: lokal dapat bervariasi menurut proses. Dua proses berbeda yang dijalankan oleh pengguna yang sama mungkin berada di lokasi yang berbeda hanya dengan mengatur variabel lingkungan yang berbeda.)

singkat
sumber
1
"NUL-dihentikan, '/' - urutan byte yang dibatasi" Tetapi tanpa pengkodean, bagaimana Anda tahu byte apa yang mewakili '/'?
Jack
1
@ Jack Selalu '\x2F'terlepas dari apa yang tampak /. Sangat berbeda dalam SJIS.
ephemient
1
Ah, baiklah. Apakah Anda mempertimbangkan memperbarui jawaban dengan info itu? Mungkin itu hanya karena saya baru-baru ini bekerja pada pustaka konversi charset, tetapi frasa "'/' - urutan byte yang dibatasi" tidak masuk akal bagi saya.
Jack
Jadi bagaimana cara melihat byte nama file dalam sesi SSH di HEX?
Dims
11

Lapisan unix / posix dari linux tidak peduli pengkodean mana yang Anda gunakan. Ini menyimpan urutan byte dari encoding Anda saat ini apa adanya.

Saya pikir opsi-opsi mount ada untuk membantu Anda mengonversi filesystem tertentu yang mendefinisikan charset ke charset sistem Anda. (CDROM, NTFS dan varian FAT menggunakan beberapa varian unicode).

Saya berharap unix mendefinisikan sistem pengkodean global, tetapi sebenarnya ini adalah pengaturan per pengguna. Jadi, jika Anda mendefinisikan penyandian berbeda maka kolega Anda, nama file Anda akan muncul secara berbeda.

Bert Huijben
sumber
Ok jadi saya mungkin harus memeriksa lokal apa yang sedang digunakan pengguna dan mengubahnya ke file baru sehingga ia akan melihat nama file dengan benar di Nautilus dll. Bagaimana saya bisa tahu apa nama file charset saat ini untuk pengguna saat ini?
martin
1
@martin Ini bahkan tidak sesederhana itu ... Proses yang berbeda dapat menggunakan pengkodean yang berbeda, tergantung pada variabel env dan bahasa yang digunakan untuk menulis.
Basic
5

Tergantung bagaimana Anda me-mount sistem file, lihat saja opsi mount untuk berbagai sistem file di man mount. Misalnya iso9660, vfatdan fatmemiliki iocharsetdan utf8opsi.

Adam Byrtek
sumber
Jadi jika saya memasangnya menggunakan utf8, apakah saya juga harus mengirim utf8 ke open () syscall?
martin
Saya juga menemukan ini ( library.gnome.org/devel/glib/unstable/... ) yang tampaknya menunjukkan bahwa pengkodean charset nama file tergantung pada lokal apa yang diatur?
martin