Jakiego kodowania zestawów znaków używa się w nazwach plików i ścieżkach w systemie Linux?


45

Czy to zależy od używanego systemu plików? Na przykład ext2 / ext3 / ext4, ale także co się stanie, gdy włożę jedną z tych „radosnych” płyt CD-ROM z ISO 9660? Słyszałem, że POSIX zawiera specyfikację kodowania zestawów nazw plików?

Zasadniczo zastanawiam się, czy jeśli mam nazwę pliku zakodowaną w UTF-8, jakie przetwarzanie / kowariancję muszę wykonać przed przekazaniem go do interfejsu API we / wy pliku w systemie Linux?


Poniższe odpowiedzi mówią, że system operacyjny i system plików nie dbają o kodowanie. Niektóre systemy plików, takie jak HFS +, bardzo dbają. Uważam, że HFS + wymaga UTF-8, który przekształca wewnętrznie w ograniczony dialekt UTF-16. NTFS ma również podobny problem, ale nie jestem pewien szczegółów.
zmccord

HFS + wymaga również, aby nazwy były rozkładane, co nie gra dobrze z tendencją Linuksa do używania wstępnie skomponowanych. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Odpowiedzi:


49

Jak zauważają inni, tak naprawdę nie ma na to odpowiedzi: nazwy plików i ścieżki nie mają kodowania; system operacyjny zajmuje się tylko sekwencją bajtów. Poszczególne aplikacje mogą w jakiś sposób interpretować je jako zakodowane, ale to się różni.

W szczególności Glib (używany przez aplikacje Gtk +) zakłada, że ​​wszystkie nazwy plików są zakodowane w UTF-8, niezależnie od ustawień regionalnych użytkownika . Można to zastąpić zmiennymi środowiskowymi G_FILENAME_ENCODING i G_BROKEN_FILENAMES .

Z drugiej strony Qt domyślnie zakłada, że ​​wszystkie nazwy plików są zakodowane w ustawieniach regionalnych bieżącego użytkownika . Indywidualna aplikacja może zastąpić to założenie, chociaż nie znam żadnego takiego, i nie ma zewnętrznego przełącznika zastępowania.

Nowoczesne dystrybucje Linuksa są skonfigurowane w taki sposób, że wszyscy użytkownicy używają ustawień narodowych UTF-8, a ścieżki w podłączeniach obcych systemów plików są tłumaczone na UTF-8, więc ta różnica w strategiach na ogół nie ma wpływu. Jednakże, jeśli naprawdę chcesz być bezpieczny, nie możesz zakładać żadnej struktury dotyczącej nazw plików poza „NUL-terminated,” / ”- delimitowana sekwencja bajtów”.

(Uwaga: ustawienia regionalne mogą się różnić w zależności od procesu. Dwa różne procesy uruchomione przez tego samego użytkownika mogą znajdować się w różnych lokalizacjach po prostu przez ustawienie różnych zmiennych środowiskowych.)


1
„NUL-terminated,” / ”- delimitowana sekwencja bajtów” Ale bez kodowania, skąd wiesz, który bajt reprezentuje „/”?
Jack

1
@Jack Zawsze '\x2F'bez względu na to, jak to wygląda /. Szczególnie różni się w SJIS.
ephemient

1
Ah, dobrze. Czy zastanowiłbyś się nad zaktualizowaniem odpowiedzi o te informacje? Może to dlatego, że ostatnio pracowałem nad biblioteką konwersji zestawu znaków, ale wyrażenie „” / ”- rozdzielana sekwencją bajtów” nie ma dla mnie sensu.
Jack

Jak więc zobaczyć bajty nazwy pliku w sesji SSH w HEX?
Przerywa

11

Warstwa linuksowa unix / posix nie ma znaczenia, jakiego kodowania używasz. Przechowuje sekwencję bajtów bieżącego kodowania w stanie, w jakim się znajduje.

Myślę, że te opcje montowania służą do konwersji określonych systemów plików, które definiują zestaw znaków do zestawu znaków systemowych. (CDROM-y, NTFS i warianty FAT używają niektórych wariantów Unicode).

Chciałbym, aby unix zdefiniował globalne kodowanie systemowe, ale tak naprawdę jest to ustawienie dla użytkownika. Więc jeśli zdefiniujesz inne kodowanie niż twoja koleżanka, twoje nazwy plików pojawią się inaczej.


Ok, więc powinienem prawdopodobnie sprawdzić, jakich ustawień regionalnych używa użytkownik i przekonwertować je na nowe pliki, aby mógł poprawnie zobaczyć nazwę pliku w Nautilus itp. Jak mogę określić, jaki jest obecny zestaw znaków nazwy pliku dla bieżącego użytkownika?
martin

1
@martin To nie jest nawet takie proste ... Różne procesy mogą korzystać z różnych kodowań, w zależności od zmiennych env i języka, w którym zostały napisane.
Podstawowy

5

Zależy to od sposobu zamontowania systemu plików, wystarczy spojrzeć na opcje montowania dla różnych systemów plików w man mount. Na przykład iso9660, vfati fatmieć iocharseti utf8opcje.


Więc jeśli montuję go za pomocą utf8, czy powinienem również przekazać utf8 do syscall open ()?
martin

Znalazłem też to ( library.gnome.org/devel/glib/unstable/… ), co wydaje się wskazywać, że kodowanie znaków w nazwach plików zależy od ustawień regionalnych?
martin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.