Como fazer com que o shell de login xterm use utf-8?

6

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

Meu problema é que todos os caracteres multi-byte utf-8 são confundidos no shell de login do xterm. Por exemplo, aqui está como a string "Wilhelm Röntgen" é renderizada nas duas instâncias do shell (a fonte usada é uma fonte Unicode e é a mesma fonte nas duas instâncias do shell):

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

Se eu entendi as coisas corretamente, o software da 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 do terminal X no PC e se comunicam com o RHEL6 usando o protocolo X11. Abaixo está como as duas conchas aparecem na minha área de trabalho, catenando um arquivo com caracteres unicode multibye para o terminal.

AquiestáocomandoqueconfigureioX-Win32parausarparainiciaroshelldelogin:

xterm-u8-ls

Noentanto,apóseufaçoologin,eupossofazerxtermnoshelldelogin,eaquelecomandoqueirábifurcarumanovainstânciaxtermondeaconfiguraçãolocalefuncionacomoesperado(ex.:utf-8caracteressãoprocessadocorretamente).

Aquiestãoasconfiguraçõesrelevantesqueaparecemnoshelldelogin:

$localeLANG=en_US.UTF-8LC_CTYPE=en_US.UTF-8LC_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

Eu também tenho as duas linhas seguintes em .Xresources:

xterm*locale: true
xterm*utf8: 1

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

    
por Free Radical 22.02.2014 / 16:04

3 respostas

8

No momento em que o processo sshd no computador remoto é executado em / usr / bin / xterm, há muito poucas variáveis de ambiente configuradas. Na verdade, a variável LANG não está definida. Portanto, o processo xterm não sabe que deve exibir caracteres em UTF-8. Ele retorna aos padrões do xterms. Seja o que for que seja.

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.

É necessário 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 da seguinte forma:

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

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

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

Eskil ... : -)

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

xterm -en en_US.UTF-8

P.P: Eu não acho que configurar recursos em ~ / .Xresources entrará em vigor a menos que você os mescle com 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 o conjunto de recursos xterm *. Mas você pode ser capaz de definir recursos no X-Win32 se ele suportar isso.

    
por 27.02.2014 / 12:51
2

Acho que você não está dizendo xterm para usar uma fonte Unicode. Eu vejo que você está usando algum xterm-compilado-para-Windows ou algo assim, mas sob o Arch (e outras distros) quando executando um xterm real , eu inicio assim:

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

Outro emulador de terminal do Windows, PuTTY , parece muito bom em mostrar o UTF-8. Se 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 de múltiplos bytes, você sabe que o problema não está no lado do servidor, mas sim no emulador de terminal.

    
por 22.02.2014 / 16:24
0

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

X-Win32 is an X Server which main purpose is to display remote graphical applications. Most modern Unix/Linux systems have an X based terminal emulator included in the X libraries. As such X-Win32 does not include one by default.

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

I don't think any xterm process is ever running on the RHEL server. 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. The X-Win32 from StarNet Comm. Corp. turns my PC into a X terminal, and both xterm instances executes on the PC, using the X.11 protocol to communicate with the ssh instances on RHEL6. At least, that is the way I believe X11 works.

Mas não é assim que funciona. O processo xterm iniciado no servidor RHEL é executado em nesse 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 é por meio do script uxterm (que faz parte do mesmo pacote que inclui xterm e seu recurso -arquivos). De acordo com a FAQ do xterm descrevendo uxterm :

XTerm does not automatically set your locale. It can be told to use your locale settings. This is a shell script which sets xterm's resources to use UTF-8 encoding, and use UTF-8 fonts. There is a similar lxterm script, but it relies upon non-portable applications, unlike uxterm.

Como observado em outros comentários, suas variáveis de ambiente no login podem não ter informações suficientes para iniciar xterm automaticamente com codificação UTF-8 (e fontes). Isso é feito pelo script uxterm .

    
por 24.09.2016 / 18:33

Tags