я используюxterm(X-Win32 2012 Build 30 от StarNet Communications Corp) для входа с ПК под управлением Windows 7 в Red Enterprise Linux 6 (RHEL6).
Моя проблема в том, что все многобайтовые символы utf-8 выводятся искаженными в оболочке входа xterm. Например, вот как строка "Wilhelm Röntgen" отображается в двух экземплярах оболочки (используемый шрифт — шрифт Unicode, и он один и тот же в обоих экземплярах оболочки):
Login shell: Wilhelm Röntgen
Second shell: Wilhelm Röntgen
Если я правильно понял, программное обеспечение от StarNet Communications Corp реализует (или эмулирует) X-терминал (тонкий клиент, который запускает X-сервер). То есть оба экземпляра оболочки запускаются в окне X-терминала на ПК и взаимодействуют с RHEL6 по протоколу X11. Ниже показано, как обе оболочки выглядят на моем рабочем столе, прикрепляя файл с многобайтовыми символами Unicode к терминалу.
Вот команда, которую я настроил для X-Win32, чтобы она запускала оболочку входа:
xterm -u8 -ls
Однако,послеЯ вхожу в систему, я могу сделать это xterm
в оболочке входа, и эта команда создаст новый экземпляр xterm, в котором настройки локали будут работать так, как и ожидалось (т. е. символы utf-8 будут отображаться правильно).
Вот соответствующие настройки, которые отображаются в оболочке входа:
$ 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=C
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=
$ printenv XTERM_LOCALE
en_US.UTF-8
У меня также есть следующие две строки в .Xresources:
xterm*locale: true
xterm*utf8: 1
Похоже, что login shell xterm не распознает установленную мной локаль, но я не понимаю, почему. Мой xterm явно способен на это, поскольку все non-login shell делают это по умолчанию.
решение1
В то время, когда процесс sshd на удаленном компьютере разветвляется для запуска /usr/bin/xterm, установлено очень мало переменных окружения. Фактически переменная LANG не установлена. Следовательно, процесс xterm не знает, что он должен отображать символы в формате UTF-8. Он возвращается к значениям по умолчанию xterm. Что бы это ни было.
Однако подоболочка, запущенная внутри xterm, запускает все скрипты настройки и т. п. Включая установку переменной среды LANG.
Необходимо понимать разницу между удаленным процессом xterm и процессом оболочки, работающим внутри xterm.
Решение — запустить удаленный процесс xterm следующим образом:
/usr/bin/env LANG=en_US.UTF-8 /usr/bin/xterm
env(1) — утилита для запуска программы в измененной среде.
Установка LANG позволит удаленному xterm правильно отображать символы UTF-8.
Эскиль... :-)
P.S.: Прочитав страницу руководства xterm, я также нашел более простой способ добиться этого:
xterm -en en_US.UTF-8
PPs: Я не думаю, что настройка ресурсов в ~/.Xresources вступит в силу, если вы не объедините их с xrdb. Процесс xterm на компьютере Linux будет запрашивать X-сервер, работающий на вашем компьютере Windows. В момент запуска xterm маловероятно, что на вашем сервере X-Win32 установлены ресурсы xterm*. Но вы можете установить ресурсы в X-Win32, если он это поддерживает.
решение2
Я думаю, вы не говорите xterm
использовать шрифт Unicode. Я вижу, что вы используете какой-то xterm-compiled-for-Windows или что-то в этом роде, но под Arch (и другими дистрибутивами) при запускенастоящийxterm, я запускаю его так:
xterm -u8 -fn '-misc-fixed-bold-r-normal--15-140-75-75-c-90-iso10646-1'
Еще один эмулятор терминала Windows,Шпатлевка, кажется, довольно хорошо отображает UTF-8. Если вам это разрешено, вы должны установить PuTTY, настроить его на использование набора символов UTF-8 и подключиться к серверу Red Hat. Если PuTTY правильно отображает многобайтовые символы UTF-8, вы знаете, что проблема не на стороне сервера, а в эмуляторе терминала.
решение3
Вопрос и последующие комментарии указывают на некоторую путаницу. Согласно статье базы знаний StarNetГде находится мой эмулятор терминала?
X-Win32 — это X-сервер, основная цель которого — отображать удаленные графические приложения. Большинство современных систем Unix/Linux имеют эмулятор терминала на базе X, включенный в библиотеки X. Таким образом, X-Win32 не включает его по умолчанию.
В комментарии, добавленном к вопросу @bruce-ediger, говорится, что
Я не думаю, что какой-либо процесс xterm когда-либо запущен на сервере RHEL.
When I type in xterm in the shell on RHEL, all it does is to send a message to the X windows server on the PC, requesting that it creates another xterm process/window.
X-Win32 от StarNet Comm. Corp. превращает мой ПК в X-терминал, и оба экземпляра xterm выполняются на ПК, используя протокол X.11 для связи с экземплярами ssh на RHEL6. По крайней мере, я считаю, что X11 работает именно так.
Но это не так работает. Процесс xterm, запущенный на сервере RHEL, работаетнаэтот сервер. Он взаимодействует с сервером StarNet X (X-Win32), но процесс xterm остается там, где он был запущен.
Самый простой способ запустить xterm с использованием UTF-8 — черезuxterm
скрипт (который является частью того же пакета, который включаетxterm
и его файлы ресурсов). Согласночасто задаваемые вопросы по xtermописываяuxterm
:
XTermне устанавливает автоматически ваш язык. Его можно заставить использовать ваши настройки языка. Это скрипт оболочки, который устанавливает ресурсы xterm для использования кодировки UTF-8 и шрифтов UTF-8. Существует похожий
lxterm
скрипт, но он опирается на непереносимые приложения, в отличие отuxterm
.
Как отмечено в других комментариях, ваши переменные среды при входе в систему могут не иметь достаточной информации для запускаxterm
автоматически с кодировкой UTF-8 (и шрифтами). Это делаетсяuxterm
сценарий.