如何讓登錄 shell xterm 使用 utf-8?
我使用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 中設置資源。