提示cannot change locale (UTF-8) No such file or directory
date
May 26, 2023
slug
sshlocale
status
Published
tags
Linux
summary
type
Post
在Mac下使用 iTerm2 或 warp 远程登录Linux时,遇到提示:
cannot change locale (UTF-8) No such file or directory
。在远端服务器上输入
locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.utf8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
在自己的Mac上输入
locale
,发现本机Mac是这样的LANG=""
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
考虑可能是Mac上
UTF-8
的字符集Linux上没有对应的?真正的原因是:结果表现为确实没有对应的,但是根本原因是因为我使用zsh替代的了原始的bash,所以在
~/.zshrc
没有设置LC_CTYPE
,而没有设置时LC_CTYPE
的默认值变成了UTF-8
,这个值对哪个系统来说都是不存在的。另外:locale -a
:可以查看机器上支持的字符集
printenv
:从输出结果中LC_CTYPE
看到目前在用的字符集
所以有3种解决方法:
方法一:指定本地或远端的字符集
在本地如果使用zhs,可
vim ~/.zshrc
文件尾增加下面内容,然后sourceexport LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
或者在远端
vim /etc/environment
增加下面内容,然后重新登录LANG=en_US.utf-8
LC_ALL=en_US.utf-8
其实更推荐两端都设定。如果是自己服务器,可尝试安装其缺失的字符集,这样子一劳永逸。
方法二:不要将LANG设置发送到服务器端
打开本地ssh配置文件,
sudo vim /etc/ssh/ssh_config
, 注释掉如下几行Host *
SendEnv LANG LC_*
如果是使用iTerm2或Terminal,找到对应Preferences,关闭掉关于“Set locale”的开关即可。
如果还遇到vim打开某文件乱码,可以
vim /etc/vimrc
添加以下内容set encoding=utf-8
set fileencodings=utf-8,gbk,gb2312,gb18030
参考资料: