Linux'ta dosya adları ve yollar için hangi karakter kümesi kodlaması kullanılır?


45

Hangi dosya sistemini kullandığıma bağlı mı? Örneğin, ext2 / ext3 / ext4, aynı zamanda ISO 9660'lı "joliet" CD-ROM'larından birini yerleştirdiğimde ne olur? POSIX'in dosya adlarının karakter kümesi kodlaması için bir tür özellik içerdiğini duydum?

Aslında, merak ettiğim şey UTF-8 kodlu bir dosya adımın olması durumunda, Linux'ta bir dosya giriş / çıkış API'sine geçirmeden önce hangi işleme / kapsamaya ihtiyacım var?


Aşağıdaki yanıtlar, işletim sistemi ve dosya sisteminin kodlamalar ile ilgilenmediğini söylüyor. HFS + gibi bazı dosya sistemleri büyük öneme sahiptir. HFS +, içsel olarak UTF-16'nın sınırlı bir lehçesine dönüştüren UTF-8'i gerektirdiğini düşünüyorum. NTFS'de de benzer bir sorun var ama ayrıntılarda net değilim.
zmccord

HFS + ayrıca, linux'un önceden oluşturulmuş olma eğiliminde hoş görünmeyen adların ayrıştırılmasını gerektirir. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Yanıtlar:


49

Başkaları tarafından belirtildiği gibi, bunun gerçekten bir cevabı yoktur: dosya isimleri ve yolların kodlaması yoktur; İşletim sistemi yalnızca bayt sırası ile ilgilenir. Bireysel uygulamalar onları bir şekilde kodlanmış olarak yorumlamayı seçebilir, ancak bu değişebilir.

Özellikle, Glib (Gtk + apps tarafından kullanılır) , kullanıcının yerel ayarından bağımsız olarak tüm dosya adlarının UTF-8 kodlu olduğunu varsayar . Bu, G_FILENAME_ENCODING ve G_BROKEN_FILENAMES çevre değişkenleriyle geçersiz kılınabilir .

Diğer taraftan, Qt , tüm dosya adlarının geçerli kullanıcının yerel ayarında kodlandığını varsaymak için varsayılan değerlerdir . Bireysel bir uygulama bu varsayımı geçersiz kılmayı seçebilir, fakat ne olduğunu bilmeme rağmen harici bir geçersiz kılma anahtarı yok.

Modern Linux dağıtımları, tüm kullanıcıların UTF-8 yerellerini kullandığı ve yabancı dosya sistemi bağlantılarındaki yolları UTF-8'e çevrildiği için kurulur, bu nedenle stratejilerdeki bu farkın genellikle bir etkisi olmaz. Ancak, gerçekten güvende olmak istiyorsanız, "NUL ile sonlandırılmış," / "- sınırlandırılmış bayt dizisi" nin ötesinde dosya adları ile ilgili herhangi bir yapıya sahip olamazsınız.

(Ayrıca not: yerel ayar işleme göre değişebilir. Aynı kullanıcı tarafından yürütülen iki farklı işlem yalnızca farklı ortam değişkenleri ayarlanmış olarak farklı yerlerde olabilir.)


1
"NUL-sonlandırılmış, '/' - ayrılmış bayt dizisi" Ama kodlama olmadan, baytın '/' neyi temsil ettiğini nereden biliyorsunuz?
Jack

1
@Jack Her zaman '\x2F'nasıl gözüktüğünden bağımsız olarak /. SJIS'de özellikle farklı.
ephemient

1
Ah tamam. Cevabı bu bilgiyle güncellemeyi düşünür müsünüz? Belki de son zamanlarda karakter kümesi dönüştürme kitaplığında çalıştığım içindir, ancak "'/' - ayrılmış bayt dizisi" ifadesi bana bir şey ifade etmiyor.
Jack

Peki, HEX'te SSH oturumunda dosya adı baytlarını nasıl görebiliriz?
Dims

11

Linux'un unix / posix katmanı, hangi kodlamayı kullandığınızla ilgilenmez. Geçerli kodlamanızın bayt sırasını olduğu gibi depolar.

Bu takma seçeneklerinin, bir karakter kümesi tanımlayan belirli dosya sistemlerini sistem karakter dizinize dönüştürmenize yardımcı olmak için orada olduğunu düşünüyorum. (CDROM'lar, NTFS ve FAT varyantları bazı unicode varyantları kullanır).

Unix'in global bir kodlama sistemi tanımlamasını diliyorum, ancak aslında kullanıcı başına bir ayardır. Yani farklı bir kodlama tanımladıysanız, meslektaşınız, dosya isimleriniz farklı görünecektir.


Tamam, öyleyse kullanıcının şu anda hangi yerel ayarları kullandığını kontrol etmeli ve yeni dosyalar için buna dönüştürmeliyim, böylece dosya adını Nautilus vb. 'Da doğru görebilsin.
martin

1
@martin O kadar basit değil ... Farklı işlemler, env değişkenlerine ve yazdığı dile bağlı olarak, farklı kodlamalar kullanabilir.
Temel

5

Bu, dosya sistemini nasıl bağladığınıza bağlıdır, sadece içindeki farklı dosya sistemleri için takma seçeneklerine bir göz atın man mount. Örneğin iso9660, vfatve fatsahip iocharsetve utf8seçenekler.


Bu yüzden utf8 kullanarak monte edersem, utf8'i open () sistem çağrısına da geçirmeli miyim?
martin

Ayrıca şunu da buldum ( library.gnome.org/devel/glib/unstable/… ). Bu, dosya adlarının karakter kodlamasının hangi yerel ayarın yapıldığına bağlı olduğunu gösteriyor gibi görünüyor?
martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.