Ze względu na dużą wymianę plików między systemem Windows ( kodowanie GBK ) a Linuksem ( kodowanie UTF-8 ) łatwo napotka problemy związane z kodowaniem znaków, takie jak:
- Pliki zip / tar, których nazwa zawiera chińskie znaki w systemie Windows, rozpakuj / rozpakuj w systemie Linux.
- uruchom migrowaną starszą aplikację internetową Java (zaprojektowaną w systemie Windows, używając kodowania GBK w JSP), która zapisuje na dysku pliki o nazwie kodowania GBK.
- ftp pobierz / umieść pliki o nazwie kodowania GBK między serwerem FTP Windows a klientem Linux.
- przełącz środowisko LANG w systemie Linux.
Częstym problemem wspomnianych wcześniej jest lokalizacja / nazewnictwo plików. Po przejrzeniu google dostałem artykuł Używanie Unicode w Linuksie http://www.linux.com/archive/feed/39912 :
system operacyjny i wiele narzędzi nie zdają sobie sprawy, jakie znaki reprezentują bajty w nazwach plików.
Możliwe jest więc posiadanie 2 中文 plików .txt z innym kodowaniem:
[root@fedora test]# ls
???? 中文
[root@fedora test]# ls | iconv -f GBK
中文
涓iconv: illegal input sequence at position 7
[root@fedora test]# ls 中文 && ls $'\xd6\xd0\xce\xc4'|iconv -f gbk
中文
中文
Pytania:
- Czy możliwe jest skonfigurowanie systemu plików Linux przy użyciu stałego kodowania znaków (np. NTFS wewnętrznie korzysta z UTF-16) do przechowywania nazw plików niezależnie od środowiska LANG / LC_ALL?
- Lub, tak naprawdę chcę zapytać: czy jest możliwe, aby nazwa pliku 中文 .txt (
$'\xe4\xb8\xad\xe6\x96\x87.txt'
) w środowisku zh_CN.UTF-8 i nazwa pliku 中文 .txt ($'\xd6\xd0\xce\xc4.txt'
) w środowisku zh_CN.GBK odnosiła się do tego samego pliku ? - Jeśli nie można go skonfigurować, to czy jest możliwe załatanie jądra w celu przetłumaczenia kodowania znaków między systemem plików a bieżącym środowiskiem (tylko pytanie, a nie prośba o wdrożenie)? i ile efektu wydajności, jeśli to możliwe?
linux
filesystems
filenames
character-encoding
LiuYan 刘 研
źródło
źródło
Odpowiedzi:
Przeformułowałem nieco twoje pytania, z powodów, które powinny wydawać się oczywiste, gdy czytasz je po kolei.
1. Czy jest możliwe skonfigurowanie systemu plików linux do używania stałego kodowania znaków do przechowywania nazw plików niezależnie od środowiska LANG / LC_ALL?
Nie, nie jest to możliwe: jak wspominasz w swoim pytaniu, nazwa pliku UNIX to tylko sekwencja bajtów; jądro nie wie nic o kodowaniu, które jest całkowicie pojęciem przestrzeni użytkownika (tj. poziomu aplikacji).
Innymi słowy, jądro nic nie wie o
LANG
/LC_*
, więc nie może tłumaczyć.2. Czy można pozwolić, aby różne nazwy plików odnosiły się do tego samego pliku?
Możesz mieć wiele pozycji katalogu odnoszących się do tego samego pliku; możesz to zrobić za pomocą twardych lub symbolicznych linków .
Należy jednak pamiętać, że nazwy plików, które nie są prawidłowe w bieżącym kodowaniu (np. Łańcuch znaków GBK podczas pracy w ustawieniach regionalnych UTF-8) będą wyświetlane źle, jeśli w ogóle.
3. Czy jest możliwe załatanie jądra w celu przetłumaczenia kodowania znaków między systemem plików a bieżącym środowiskiem?
Nie możesz łatać jądra, aby to zrobić (patrz 1.), ale możesz - teoretycznie - załatać bibliotekę C (np. Glibc), aby wykonać to tłumaczenie, i zawsze konwertuj nazwy plików na UTF-8, gdy wywołuje jądro, i przekonwertuj je z powrotem na bieżące kodowanie, gdy odczyta nazwę pliku z jądra.
Prostszym podejściem może być napisanie nakładkowego systemu plików za pomocą FUSE , który przekierowuje każde żądanie systemu plików do innej lokalizacji po konwersji nazwy pliku na / z UTF-8. Idealnie byłoby, gdybyś mógł zamontować ten system plików
~/trans
, a kiedy dostęp do~/trans/a/GBK/encoded/path
niego, system plików FUSE naprawdę uzyskuje dostęp/a/UTF-8/encoded/path
.Problem z tymi podejściami polega jednak na tym: co robisz z plikami, które już istnieją w twoim systemie plików i nie są zakodowane w UTF-8? Nie możesz po prostu przekazać ich nieprzetłumaczonych, ponieważ wtedy nie wiesz, jak je przekonwertować; nie można ich zmieniać, tłumacząc nieprawidłowe sekwencje znaków,
?
ponieważ może to powodować konflikty ...źródło
Możesz ograniczyć liczbę obsługiwanych ustawień regionalnych tylko do ustawień regionalnych UTF-8.
http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5
źródło