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

如何讓登入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 預設都會執行此操作。

答案1

當遠端電腦上的 sshd 進程分叉執行 /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 中設定資源。

答案2

我認為您沒有告訴xterm我們使用 Unicode 字體。我發現您正在使用一些 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 Comm 的 X-Win32。 Corp. 將我的 PC 變成 X 終端,兩個 xterm 執行個體都在 PC 上執行,使用 X.11 協定與 RHEL6 上的 ssh 執行個體進行通訊。至少,我相信 X11 就是這樣運作的。

但事實並非如此。 RHEL伺服器上啟動的xterm進程執行那個伺服器。它與 StarNet X 伺服器 (X-Win32) 通信,但 xterm 進程保留在其啟動時的位置。

使用 UTF-8 啟動 xterm 最簡單的方法是透過uxterm腳本(它是同一包的一部分,其中包括xterm及其資源文件)。根據xterm 常見問題解答描述uxterm

XTerm不會自動設定您的區域設定。可以告訴它使用您的區域設定。這是一個 shell 腳本,它將 xterm 的資源設定為使用 UTF-8 編碼,並使用 UTF-8 字體。有一個類似的lxterm腳本,但它依賴非便攜式應用程序,與uxterm

正如其他評論中所述,您登入時的環境變數可能沒有足夠的資訊來啟動xterm自動使用 UTF-8 編碼(和字體)。這是由uxterm腳本。

相關內容