当通过 ssh 进入 Linux 并运行 Emacs 时,Mac 终端无法正确显示 Unicode UTF-8

当通过 ssh 进入 Linux 并运行 Emacs 时,Mac 终端无法正确显示 Unicode UTF-8

我登录了 Mac,运行终端,通过 ssh 连接到 Linux 系统并make在 emacs 窗口中运行。我的错误日志如下所示:

_raw.cpp:139: error: invalid conversion from âconst char*â to âsize_tâ
_raw.cpp:139: error:   initializing argument 2 of âint snprintf(char*, size_t, const char*, ...)â
_raw.cpp:139: error: invalid conversion from âintâ to âconst char*â
_raw.cpp:139: error:   initializing argument 3 of âint snprintf(char*, size_t, const char*, ...)â

请注意,GCC 显然正在尝试使用 unicode 智能引号字符,但它们以 UTF-8 发送,而 Emacs 正在拦截它们。我认为这里的问题是 EMACS 需要将子进程生成的 UTF-8 传递到终端。有什么想法可以实现吗?

答案1

远程主机不知道您的终端正在使用 UTF-8。

默认情况下,终端将文本编码为 UTF-8,并且默认情况下终端通过环境变量将其传达给终端 shell LANG(只要您没有更改这些首选项设置)。

您可以通过命令查看所使用的编码(和语言)locale。例如,在我的 Mac 上显示的是:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

如果您在本地和远程主机上运行它,您应该看到远程主机在语言环境值中不包含“utf-8”。

但是,在 Mac OS X Lion 10.7 之前,默认情况下 ssh 不会将LANG环境变量传送给远程主机。您可以安排这样做,但这需要配置 Mac 上的 ssh 客户端以发送变量,LANG并配置远程主机上的 sshd 守护程序以读取它。

有关详细信息,请参阅 Mac 和远程主机上的 ssh_config 和 sshd_config 手册页。您可能会在Mac 上的文件和SendEnv LANG LC_*远程主机上添加一行(远程主机上的详细信息可能有所不同)。/etc/ssh/ssh_configAcceptEnv LANG LC_*/etc/ssh/sshd_config

export LANG="en_US.UTF-8"或者,您只需登录远程 shell 即可(具体语法取决于您使用的远程 shell)。如果不是美国英语(“en_US”),请务必使用正确的语言。您也可以通过在shell启动脚本(如在远程主机上)LANG内进行设置来自动执行此操作。~/.bash_profile

相关内容