设想:
我有一台服务器,上面运行着 tmux 会话。我们称该会话为tmux_session
在这篇文章的其余部分。
可以通过两种略有不同的方式来附加到该会话:
首先通过 ssh 连接到服务器:
user@host$ ssh [email protected]
然后附加到指定的会话:
user@server$ tmux a -d -t tmux_session
通过 ssh-ing 并同时附加:
user@host$ ssh [email protected] -t tmux -a -d -t tmux_session
症状:
方法一按预期工作。我的LANG
设置为C.UTF-8
, echo
-ing 它在里面tmux_session
工作正常,并且报告正确。 Unicode 输入的字符(如“123¤”)工作得很好。
方法2产生一个会话,该会话无法显示除简单 ASCII 之外的 Unicode 字符。所有其他字符均替换为_
(下划线)。然而当进入一个特殊字符,该字符实际上输入到内部运行的任何应用程序中tmux_session
,我使用编辑器、IRC 客户端等确认了它。当我使用方法 1 分离并重新附加时,先前输入的字符会正确显示。
使用方法 2 时的此问题仅在使用 ssh 命令附加到会话时发生,并且仅影响字符的显示,而不影响实际输入的字符。
不过,里面的一些输出tmux
两次都有点损坏。当我进入echo $LANG
内部时tmux_session
使用任何一个方法,我看到这个:
$ echo $LANG
cho C.UTF-8C.UTF-8
某些内容出现乱码,由于某种原因输入行(部分)重复。我在 superuser.com 上的另一篇文章中读到,应该首先尝试删除.tmux.conf
.我没有.tmux.conf
,所以没有该文件似乎并不能缓解我的问题。无论如何,$LANG
设置为C.UTF-8
是正确的。
当仅通过 ssh 连接到服务器时,不会发生这种乱码输出。
答案1
您正在检查会话内的区域设置tmux
,而不是那些tmux
本身接收到的区域设置。
server.ltd
可能没有AcceptEnv LANG LC_*
在它的sshd_config
或/和你没有SendEnv LANG LC_*
在你的ssh_config
,所以你的本地系统和终端使用UTF-8作为字符集的事实不会传输到远程tmux
客户端。
您可以通过执行以下操作来解决它:
ssh -t [email protected] "
set -o allexport
$(locale | grep -v '"')
exec tmux -a -d -t tmux_session"
(假设本地 shell 和远程用户的登录 shell 是类似 POSIX 的)
或者,如果您知道您的终端正在以 UTF-8 进行通信,则只需对您选择的 UTF-8 语言环境进行硬编码:
ssh -t [email protected] 'exec env LANG=C.UTF-8 tmux -a -d -t tmux_session'
(所有 shell 都能理解的语法)。
答案2
tmux -u
即使 $LANG 设置不正确,也可用于强制输出 utf-8。