提示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 文件尾增加下面内容,然后source
export 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_*
如果是使用iTerm2Terminal,找到对应Preferences,关闭掉关于“Set locale”的开关即可。
 
 
如果还遇到vim打开某文件乱码,可以vim /etc/vimrc 添加以下内容
set encoding=utf-8
set fileencodings=utf-8,gbk,gb2312,gb18030
 

参考资料:

© 刘德华 2020 - 2025