如何让登录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脚本。

相关内容