Como fazer o shell de login xterm usar utf-8?

Como fazer o shell de login xterm usar utf-8?

eu usotermo x(X-Win32 2012 Build 30 da StarNet Communications Corp) para fazer login de um PC com Windows 7 em um Red Enterprise Linux 6 (RHEL6).

Meu problema é que todos os caracteres utf-8 multibyte saem distorcidos no shell de login do xterm. Por exemplo, veja como a string "Wilhelm Röntgen" é renderizada nas duas instâncias do shell (a fonte usada é uma fonte Unicode e é a mesma fonte em ambas as instâncias do shell):

 Login shell: Wilhelm Röntgen
 Second shell: Wilhelm Röntgen

Se entendi corretamente, o software da rom StarNet Communications Corp implementa (ou emula) um terminal X (um thin client que executa um servidor X). Ou seja, ambas as instâncias do shell são executadas em uma janela de terminal X no PC e se comunicam com o RHEL6 usando o protocolo X11. Abaixo está como os dois shells aparecem na minha área de trabalho, encadeando um arquivo com caracteres unicode multibye para o terminal.

insira a descrição da imagem aqui

Aqui está o comando que configurei o X-Win32 para usar para iniciar o shell de login:

xterm -u8 -ls

No entanto,depoisEu faço login, posso fazer xtermno shell de login, e aquele comando que irá bifurcar uma nova instância do xterm onde a configuração de localidade funciona conforme o esperado (ou seja, os caracteres utf-8 são renderizados corretamente).

Aqui estão as configurações relevantes conforme aparecem no shell de login:

$ 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

Também tenho as duas linhas a seguir em .Xresources:

xterm*locale: true
xterm*utf8: 1

Parece que o shell de login xterm não reconhece a localidade que defini, mas não entendo por que não. Meu xterm é claramente capaz disso, já que todos os shells que não são de login fazem isso por padrão.

Responder1

No momento em que o processo sshd no computador remoto se bifurca para executar /usr/bin/xterm, há muito poucas variáveis ​​de ambiente definidas. Na verdade, a variável LANG não está definida. Conseqüentemente, o processo xterm não sabe que deve exibir caracteres em UTF-8. Ele volta aos padrões do xterms. Seja lá o que for.

No entanto, o subshell executado dentro do xterm executa todos os scripts de configuração e similares. Incluindo a configuração da variável de ambiente LANG.

É preciso entender a diferença entre o processo xterm remoto e o processo shell executado dentro do xterm.

A solução é executar o processo xterm remoto assim:

/usr/bin/env LANG=en_US.UTF-8 /usr/bin/xterm

env(1) é um utilitário para executar um programa em um ambiente modificado.

Definir LANG fará com que o xterm remoto exiba caracteres UTF-8 corretamente.

Eskil... :-)

Ps: Lendo a página de manual do xterm também encontrei uma maneira mais fácil de conseguir isso:

xterm -en en_US.UTF-8

PPs: Não acho que a configuração de recursos em ~/.Xresources tenha efeito, a menos que você os mescle com o xrdb. O processo xterm no computador Linux consultará o servidor X em execução no seu computador Windows. No momento em que o xterm é iniciado, é muito improvável que o seu servidor X-Win32 tenha os recursos xterm* configurados. Mas você poderá definir recursos no X-Win32 se ele suportar isso.

Responder2

Acho que você não está dizendo xtermpara usar uma fonte Unicode. Vejo que você está usando algum xterm compilado para Windows ou algo assim, mas no Arch (e outras distros) ao executar umrealxterm, eu começo assim:

xterm -u8 -fn '-misc-fixed-bold-r-normal--15-140-75-75-c-90-iso10646-1'

Outro emulador de terminal do Windows,Massa, parece muito bom em mostrar UTF-8. Se você tiver permissão, você deve colocar o PuTTY, configurá-lo para usar um conjunto de caracteres UTF-8 e conectar-se ao servidor Red Hat. Se o PuTTY renderizar corretamente caracteres UTF-8 multibyte, você sabe que o problema não está no lado do servidor, mas sim no emulador de terminal.

Responder3

A pergunta e os comentários de acompanhamento indicam alguma confusão. De acordo com o artigo da base de conhecimento da StarNetOnde está meu emulador de terminal?

X-Win32 é um servidor X cujo objetivo principal é exibir aplicações gráficas remotas. A maioria dos sistemas Unix/Linux modernos possui um emulador de terminal baseado em X incluído nas bibliotecas X. Como tal, o X-Win32 não inclui um por padrão.

Um comentário adicionado à pergunta por @bruce-ediger afirma que

Não acho que nenhum processo xterm esteja em execução no servidor 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.O X-Win32 da StarNet Comm. transforma meu PC em um terminal X, e ambas as instâncias xterm são executadas no PC, usando o protocolo X.11 para se comunicar com as instâncias ssh no RHEL6. Pelo menos é assim que acredito que o X11 funciona.

Mas não é assim que funciona. O processo xterm iniciado no servidor RHEL é executadosobreesse servidor. Ele se comunica com o servidor StarNet X (X-Win32), mas o processo xterm permanece onde foi iniciado.

A maneira mais simples de iniciar o xterm usando UTF-8 é através douxtermscript (que faz parte do mesmo pacote que incluixterme seus arquivos de recursos). De acordo comPerguntas frequentes sobre xtermdescrevendouxterm:

Xtermonão define automaticamente sua localidade. Pode ser solicitado que você use suas configurações de localidade. Este é um script de shell que configura os recursos do xterm para usar a codificação UTF-8 e usar fontes UTF-8. Existe um semelhantelxtermscript, mas depende de aplicativos não portáteis, ao contráriouxterm.

Conforme observado em outros comentários, suas variáveis ​​de ambiente no login podem não ter informações suficientes para iniciarxtermautomaticamente com codificação UTF-8 (e fontes). Isso é feito pelouxtermroteiro.

informação relacionada