Как заставить оболочку входа xterm использовать utf-8?

Как заставить оболочку входа xterm использовать utf-8?

я использую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сценарий.

Связанный контент