xterm(StarNet Communications CorpのX-Win32 2012 Build 30)を使用して、Windows 7 PCからRed Enterprise Linux 6(RHEL6)にログインします。
私の問題は、すべてのマルチバイトutf-8文字がxtermログインシェルで文字化けして表示されることです。たとえば、2つのShellインスタンスで文字列「WilhelmRöntgen」がレンダリングされる方法を次に示します(使用されるフォントはUnicodeフォントであり、両方のShellインスタンスで同じフォントです)。
Login Shell: Wilhelm Röntgen
Second Shell: Wilhelm Röntgen
私が物事を正しく理解していれば、rom StarNet Communications CorpのソフトウェアはX端末(Xサーバーを実行するシンクライアント)を実装(またはエミュレート)します。つまり両方のシェルインスタンスはPCのXターミナルウィンドウで実行され、X11プロトコルを使用してRHEL6と通信します。以下は、デスクトップに両方のシェルがどのように表示されるかを示し、Unicodeマルチバイト文字を含むファイルをターミナルに連結します。
ログインシェルの起動に使用するようにX-Win32を構成したコマンドは次のとおりです。
xterm -u8 -ls
ただし、afterログインすると、ログインシェルで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
ログインShell xtermが設定したロケールを認識しないようですが、なぜそうなのかわかりません。すべての非ログインシェルがデフォルトでこれを行うため、私のxtermは明らかにこれを実行できます。
現時点では、リモートコンピューターのsshdプロセスが/ usr/bin/xtermを実行するためにforkしているため、設定されている環境変数はほとんどありません。実際、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文字が正しく表示されます。
エスキル... :-)
追伸:xtermのマニュアルページを読んで、これを実現する簡単な方法も見つけました。
xterm -en en_US.UTF-8
P.P.s:〜/ .Xresourcesでリソースを設定すると、xrdbとマージしない限り有効にならないと思います。 Linuxコンピューターのxtermプロセスは、Windowsコンピューターで実行されているXサーバーを照会します。 xtermの起動時に、X-Win32サーバーにxterm *リソースが設定されていることはほとんどありません。ただし、X-Win32がサポートしている場合は、X-Win32でリソースを設定できる場合があります。
xterm
にUnicodeフォントを使用するように言っているのではないと思います。 xterm-compiled-for-Windowsか何かを使用しているようですが、realxtermを実行すると、Arch(およびその他のディストリビューション)の下で、私はそれをこのように始めます:
xterm -u8 -fn '-misc-fixed-bold-r-normal--15-140-75-75-c-90-iso10646-1'
別のWindowsターミナルエミュレーター PuTTY は、UTF-8の表示にかなり優れているようです。許可されている場合は、PuTTYを配置し、UTF-8文字セットを使用するように設定して、Red Hatサーバーに接続する必要があります。 PuTTYがマルチバイトUTF-8文字を正しくレンダリングする場合、問題はサーバー側ではなく、ターミナルエミュレーターにあることがわかります。
質問とフォローアップのコメントは、いくつかの混乱を示しています。 StarNetのナレッジベースの記事によるとMy Terminal Emulatorはどこですか?
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のX-Win32。 Corp.は私のPCをX端末に変え、両方のxtermインスタンスがX.11プロトコルを使用してRHEL6のsshインスタンスと通信するPCで実行されます。少なくとも、それがX11の動作方法だと私は思います。
しかし、それはそれが機能する方法ではありません。 RHELサーバーで開始されたxtermプロセスはonそのサーバーを実行します。 StarNet Xサーバー(X-Win32)と通信しますが、xtermプロセスは開始された場所にとどまります。
UTF-8を使用してxtermを起動する最も簡単な方法は、uxterm
スクリプト(これはxterm
とそのリソースファイルを含む同じパッケージの一部です)を使用することです。 xterm FAQ 説明uxterm
によると:
XTermは自動的にロケールを設定しません。ロケール設定を使用するように指示できます。これは、UTF-8エンコーディングを使用し、UTF-8フォントを使用するようにxtermのリソースを設定するシェルスクリプトです。同様の
lxterm
スクリプトがありますが、-uxterm
とは異なり、移植性のないアプリケーションに依存しています。
他のコメントで述べたように、ログイン時の環境変数には、UTF-8エンコーディング(およびフォント)で自動的にxterm
を開始するための十分な情報がない可能性があります。これはuxterm
スクリプトによって行われます。