Próbuję dowiedzieć się, jak $LANG
zachowuje się zmienna z gnome-terminalem (i opcją preferencji kodowania znaków). Używam iso8859-1 (latin1) jako mojego głównego zestawu znaków i wszystkie moje nazwy plików są zakodowane jako takie.
Dla następujących testów zrobię ls -l
katalog z hiszpańskimi znakami akcentowanymi w nazwach plików:
Przypadek 1:
- terminal gnome skonfigurowany dla ISO-8859-1
LANG
ustawiono na „en_US-iso8859-1”- Wynik: poprawnie widzę wszystkie pliki
Przypadek nr 2:
- terminal gnome skonfigurowany dla UTF-8
LANG
ustawiono na „en_US-iso8859-1”- Wynik: widzę śmieciowe znaki dla wszystkich hiszpańskich znaków. Jest to oczekiwane, ponieważ zmieniłem kodowanie znaków dla terminala
Przypadek nr 3:
- terminal gnome skonfigurowany dla ISO-8859-1
LANG
ustawiono na „en_US-UTF-8”- Wynik: widzę śmieciowe znaki dla wszystkich hiszpańskich znaków.
Dlaczego w tym ostatnim przypadku widzę zniekształcone postacie? Czy wyjście ls nie powinno wysyłać nazw plików prosto do terminala gnome? A ponieważ terminal gnome jest skonfigurowany dla ISO-8859-1, oczekiwałbym, że będą wyglądać dobrze.
Przez chwilę myślałem, że być może bash rozważa moją $LANG
zmienną i dokonuje konwersji. Potem zmieniłem terminal na UTF-8, ale nadal nie widzę poprawnie znaków. Nawet potokowałem wyjście ls do xxd i ku mojemu zdziwieniu wciąż widzę pliki zakodowane takimi, jakie są: ISO-8859-1.
Podsumowując: Jeśli mój wpis zawiera znaki ISO-8859-1, a emulator terminala jest skonfigurowany do tego samego kodowania znaków: Kto dokonuje konwersji, jeśli LANG
jest inaczej?
Dzięki za wszelką pomoc, którą możesz udzielić.
Craconia
ls
że bierze pod uwagę LC_CTYPE (w tym przypadku ustawiony na UTF-8) i dokonuje pewnego rodzaju sprawdzania poprawności zestawu znaków: ilekroć widzi coś niezgodnego z zestawem znaków, wypluwa określony znak (np. „? „). Powiedziałem „walidacja”, ponieważ nie wykona „konwersji”, jak to robi Luit. Czy to tak jest?ls
zastępuje znaki niedrukowalne przez?
. Większość łańcuchów kodowanych w łacińskim-1, które reprezentują prawdziwe słowa, mają znaki niedrukowalne, jeśli są interpretowane jako UTF-8.W przypadku # 2 i # 3 miksujesz dwa różne kodowania UTF-8 i Latin-1. W przypadku nr 1 używasz Latin-1 dla obu, więc nie masz problemu.
ls
Polecenie (i wszystkich innych Programms dobrze zachowujących się) używać ustawień Lang, określenia kodowania .Możesz miksować dwa różne języki, ale nie powinieneś mieszać dwóch różnych kodowań .
Upewnij się, że zmienne środowiskowe LC_ * również używają tego samego kodowania, co zmienna LANG.
Zasadniczo należy dziś skonfigurować system tak, aby korzystał tylko z UTF-8.
Jeśli musisz edytować staromodne pliki danych (np. Właściwości Java), powinieneś albo użyć specjalistycznego edytora (np. Java) lub zapewnić kodowanie za pomocą narzędzi takich jak
iconv
lub `recode ..źródło
To może być poza twoją potrzebą, ale ...
Okazuje się, że w RHEL5, i prawdopodobnie wcześniej, wiele stron podręcznika zostało z jakiegoś powodu z jakiegoś powodu zapomnianych przez gd. Oznacza to, że nieprzetworzona strona podręcznika została przekonwertowana z natywnego zestawu znaków na 7-bitowy kod ASCII. Bez względu na to, co robisz z LC i LANG, strona podręcznika użytkownika
latin1
tworzy która jest faktycznie bezużyteczna. Wszystkie znaki specjalne (8-bitowe) zostały zastąpione 7-bitowymi symbolami zastępczymi (zwykle??
). Uważam to za zabawne.Ale
utf8
wersja tych stron podręcznika może istnieć w katalogu specyficznym dla języka. Sztuka polega na tym, aby poprosić o nie po imieniu. Na przykład latin1 jest w rzeczywistościiso_8859-1
. Jeśli zrobisz na nim stronę man, a twoje ustawienia LANG są prawidłowe, zobaczysz, czego oczekujesz; strona man znajduje się w specyficznym dla języka subdir (en/man7/iso_8859-1.7
). Ale jeśliiso-8859-1
z jakiegoś powodu poprosisz o to , otrzymasz wersję ASCII.źródło