Jak uzyskać kodowanie znaków terminala

116

Teraz zmieniam kodowanie znaków mojego terminala gnome na „GBK” (domyślnie jest to UTF-8), ale jak mogę uzyskać wartość (kodowanie znaków) w moim Linuksie?

Liang Wul
źródło

Odpowiedzi:

108

Terminal używa zmiennych środowiskowych, aby określić, którego zestawu znaków użyć, dlatego możesz to określić, patrząc na te zmienne:

echo $LC_CTYPE

lub

echo $LANG
Valdis
źródło
4
Te zmienne środowiskowe są używane przez aplikacje, które używają terminala do operacji we / wy. Sam emulator terminala nie ma o nich żadnej wiedzy, a jego aktualnie efektywne kodowanie znaków jest ustawieniem gdzieś w programie emulatora (element danych wewnątrz klasy libvte w przypadku GNOME Terminal).
JdeBP
1
sugerowana tutaj kolejność zmiennych nie jest dobra. bardziej kompletnym rozwiązaniem byłoby coś takiego: echo $ {LC_ALL: - $ {LC_CTYPE: - $ {LANG}}}. z drugiej strony, ustawiana zmienna nie gwarantuje, że są one prawidłowe, więc powinieneś trzymać się localeprogramu (jak widać w innych odpowiedziach tutaj).
Mike Frysinger
Jak powiedział @JdeBP, terminal nie używa localezmiennych środowiskowych do określenia swojego kodowania. Terminal może jednak pozwolić aplikacjom, które z nim współpracują, poznać jego kodowanie, ustawiając localezmienne środowiskowe. Na przykład, na MacOS można wybrać kodowanie terminala i ewentualnie ustawić localezmienne środowiskowe na zacisku starcie w Terminal> Preferences> Profiles> Advanced.
Maggyero,
97

locale polecenie bez argumentów wypisze wartości wszystkich odpowiednich zmiennych środowiskowych z wyjątkiem LANGUAGE.

Aktualne kodowanie:

locale charmap

Dostępne lokalizacje:

locale -a

Dostępne kodowania:

locale -m
nyzm
źródło
1
To właśnie zadziałało dla mnie w systemie CentOS. Pokazał kodowanie systemu na podstawie aktualnych ustawień językowych. Ustawienia terminala używane do uzyskania dostępu do tej maszyny to inna historia i funkcja używanego klienta.
Phil DD,
45

Sprawdź kodowanie i język:

$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR

Pobierz wszystkie języki:

$ locale -a

Zmień na pt_PT.utf8:

$ export LC_ALL=pt_PT.utf8 
$ export LANG="$LC_ALL"
Moreno
źródło
16

Jeśli masz Pythona:

python -c "import sys; print(sys.stdout.encoding)"
Martin Thoma
źródło
1
Ze wszystkich powyższych ofert jedyną sugestią, która działała na moim pudełku ze Slackware64 wer. 14.2, był ten fragment Pythona. Dzięki!
Thomas Altfather Good,
6

O ile wiem, nie.

Wskazania okolicznościowe z $LC_CTYPE, localei takie może wydawać się intrygujący, ale są one całkowicie oddzielone od kodującego aplikację terminala (właściwie emulatorze) dzieje się przy użyciu podczas wyświetlania znaków na ekranie.

Jedynym sposobem na pewne wykrycie kodowania jest wyprowadzenie czegoś, co jest tylko obecne w kodowaniu, np. äZrobienie zrzutu ekranu, przeanalizowanie tego obrazu i sprawdzenie, czy znak wyjściowy jest poprawny.

Więc nie, niestety nie jest to możliwe.

pythonator
źródło
0

Aby zobaczyć aktualne informacje o lokalizacji użyj localepolecenia. Poniżej znajduje się przykład na RHEL 7.8

[usr@host ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Ashish Bhosle
źródło