ログイン シェル 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 マルチバイト文字を含むファイルをターミナルに連結しています。

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

以下は、ログイン シェルを起動するために X-Win32 で使用するように構成したコマンドです。

xterm -u8 -ls

しかし、ログインすると、xtermログイン シェルでそのコマンドを実行して、ロケール設定が期待どおりに機能する (つまり、utf-8 文字が正しくレンダリングされる) 新しい xterm インスタンスをフォークできます。

ログイン シェルに表示される関連設定は次のとおりです。

$ 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 で表示する必要があることを認識していません。xterm のデフォルトに戻ります。それが何であれ。

ただし、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

追記: ~/.Xresources のリソース設定は、xrdb にマージしない限り有効にならないと思います。Linux コンピュータの xterm プロセスは、Windows コンピュータで実行されている X サーバーにクエリを実行します。xterm が起動した時点で、X-Win32 サーバーに xterm* リソースが設定されている可能性はほとんどありません。ただし、X-Win32 がサポートしている場合は、X-Win32 でリソースを設定できる可能性があります。

答え2

xtermUnicodeフォントを使うようには言っていないと思います。Windows用にコンパイルされたxtermか何かを使用しているようですが、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 Comm. Corp. の X-Win32 は私の PC を X ターミナルに変え、両方の xterm インスタンスが PC 上で実行され、X.11 プロトコルを使用して RHEL6 上の ssh インスタンスと通信します。少なくとも、これが X11 の動作方法だと私は信じています。

しかし、それはそうではありません。RHELサーバー上で開始されたxtermプロセスは、の上そのサーバー。StarNet X サーバー (X-Win32) と通信しますが、xterm プロセスは開始された場所に残ります。

UTF-8を使用してxtermを起動する最も簡単な方法は、uxtermスクリプト(これは同じパッケージの一部であり、xtermおよびそのリソースファイル)。xterm に関するよくある質問記述uxterm:

XTerm自動的にロケールを設定するわけではありません。ロケール設定を使用するように指示することができます。これは、xtermのリソースをUTF-8エンコーディングとUTF-8フォントを使用するように設定するシェルスクリプトです。同様のものがあります。lxtermスクリプトですが、非ポータブルアプリケーションに依存しています。uxterm

他のコメントで指摘されているように、ログイン時の環境変数には起動に必要な情報が足りない可能性があります。xtermUTF-8エンコード(およびフォント)で自動的に変換されます。これはuxterm脚本。

関連情報