Xterm

如何讓登錄 shell xterm 使用 utf-8?

  • September 24, 2016

我使用xterm(來自 StarNet Communications Corp 的 X-Win32 2012 Build 30)從 Windows 7 PC 登錄到 Red Enterprise Linux 6(RHEL6)。

我的問題是所有多字節 utf-8 字元在 xterm 登錄 shell 中出現亂碼。例如,下面是字元串“Wilhelm Röntgen”在兩個 shell 實例中的呈現方式(使用的字型是 Unicode 字型,並且在兩個 shell 實例中是相同的字型):

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

如果我理解正確的話,來自 rom StarNet Communications Corp 的軟體實現(或模擬)一個 X 終端(一個執行 X 伺服器的瘦客戶端)。即兩個shell 實例都在PC 上的X 終端視窗中執行,並使用X11 協議與RHEL6 通信。下面是兩個 shell 在我的桌面上的顯示方式,將帶有 unicode 多字節字元的文件連接到終端。

在此處輸入圖像描述

這是我配置 X-Win32 用於啟動登錄 shell 的命令:

xterm -u8 -ls

但是,我登錄後,我可以xterm在登錄 shell 中執行該命令,該命令將派生一個新的 xterm 實例,其中區域設置按預期工作(即正確呈現 utf-8 字元)。

以下是登錄 shell 中顯示的相關設置:

$ 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 中也有以下兩行:

xterm*locale: true
xterm*utf8: 1

看起來登錄 shell xterm 無法辨識我設置的語言環境,但我不明白為什麼不。我的 xterm 顯然能夠做到這一點,因為預設情況下所有非登錄 shell 都會這樣做。

當時遠端電腦上的 sshd 程序 fork 執行 /usr/bin/xterm 設置的環境變數非常少。事實上 LANG 變數沒有設置。因此 xterm 程序不知道它應該以 UTF-8 顯示字元。它回退到 xterms 預設值。不管那可能是什麼。

但是,在 xterm 內執行的子 shell 會執行所有設置腳本等。包括設置 LANG 環境變數。

需要了解遠端 xterm 程序和在 xterm 內部執行的 shell 程序之間的區別。

解決方案是像這樣執行遠端 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

PPs:我認為在 ~/.Xresources 中設置資源不會生效,除非你將它們與 xrdb 合併。Linux 電腦上的 xterm 程序將查詢 Windows 電腦上執行的 X 伺服器。在 xterm 啟動時,您的 X-Win32 伺服器不太可能設置 xterm* 資源。但是如果 X-Win32 支持的話,你也許可以在 X-Win32 中設置資源。

引用自:https://unix.stackexchange.com/questions/116404