ログインシェルxtermがutf-8を使用する方法は?

ログインシェルxtermがutf-8を使用する方法は?

私は使うxterm(StarNet Communications CorpのX-Win32 2012 Build 30)Windows 7 PCでRed Enterprise Linux 6(RHEL6)にログインします。

私の問題は、xtermログインシェルですべてのマルチバイトutf-8文字が歪んでいることです。たとえば、「Wilhelm Röntgen」という文字列を2つのシェルインスタンスでレンダリングする方法は次のとおりです(使用されているフォントはUnicodeフォントで、両方のシェルインスタンスで同じフォントが使用されます)。

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

私が正しく理解したら、StarNet Communications CorpのソフトウェアはX端末(Xサーバーを実行しているシンクライアント)を実装(またはエミュレーション)します。つまり、両方のシェルインスタンスはPCのX端末ウィンドウで実行され、X11プロトコルを使用してRHEL6と通信します。 Unicode マルチバイト文字を含むファイルを端末に接続する 2 つのシェルがデスクトップに表示される方法は次のとおりです。

ここに画像の説明を入力してください。

以下は、ログインシェルを起動するために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には次の2行もあります。

xterm*locale: true
xterm*utf8: 1

ログインシェルxtermが私が設定したロケールを認識していないようですが、なぜ認識できないのかわかりません。ログインしていないすべてのシェルはデフォルトでこれを行うので、私のxtermは明らかにこれを行うことができます。

答え1

リモートシステムの sshd プロセスが /usr/bin/xterm を実行するために分岐した場合、環境変数はほとんど設定されません。実際、LANG変数は設定されていません。したがって、xtermプロセスはUTF-8で文字を表示する必要があることを知りません。 xterms デフォルト値に戻ります。それが何であれ。

ただし、xterm内で実行されるサブシェルは、LANG環境変数の設定を含むすべてのインストールスクリプトなどを実行します。

リモートxtermプロセスとxterm内で実行されるシェルプロセスの違いを理解する必要があります。

解決策は、次のようにリモートxtermプロセスを実行することです。

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

env(1) は、変更された環境でプログラムを実行するユーティリティです。

LANGを設定すると、リモートxtermはUTF-8文字を正しく表示します。

エスキル...:-)

PS:xtermのマニュアルページを読んでこれを達成するより簡単な方法も見つけました。

xterm -en en_US.UTF-8

PP:〜/ .Xresourcesのリソース設定は、xrdbとマージしない限り適用されないようです。 Linuxシステムのxtermプロセスは、Windowsシステムで実行されているXサーバーを照会します。 X-Win32サーバーがxtermの起動時にxterm *リソースを設定することはほとんどありません。ただし、X-Win32でサポートされている場合は、X-Win32でリソースを設定できます。

答え2

xtermUnicodeフォントを使用するように言われたようではありません。 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は質問に次のコメントを追加しました。

RHELサーバーで実行されるxtermプロセスがないようです。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.StarNet通信用のX-Win32。 Corp.は私のPCをX端末に切り替え、RHEL6のsshインスタンスと通信するためにX.11プロトコルを使用して2つのxtermインスタンスをPC上で実行しました。少なくとも私はX11がそのように動作すると信じています。

しかしそれは真実ではない。 RHELサーバーで起動されたxtermプロセスが実行されます。存在するそのサーバー。 StarNet Xサーバー(X-Win32)と通信しますが、xtermプロセスは開始位置に残ります。

UTF-8でxtermを起動する最も簡単な方法は次のとおりです。uxtermスクリプト(以下を含む同じパッケージの一部です。xtermおよび対応するリソースファイル)。 ~によるとxterm FAQ説明するuxterm:

Xタムあなたのロケールは自動的に設定されません。あなたのロケールを使用するように指示できます。これは、xtermのリソースがUTF-8でエンコードされ、UTF-8フォントを有効にするシェルスクリプトです。似たようなものがありますlxtermスクリプトだが移植性のないアプリケーションに依存します。uxterm

他のコメントで述べたように、ログイン時に環境変数にはブートに必要な情報が不十分な場合があります。xtermUTF-8エンコーディング(およびフォント)を自動的に使用します。これは次のために発生します。uxtermスクリプト。

関連情報