登陸阿里云CentOS出現警告提示
Welcome to aliyun Elastic Compute Service!
-bash: warning: setlocale: LC_CTYPE: 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.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
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=
在自己的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
,這個值對哪個系統來說都是不存在的。
那么有兩種解決方法:
- 如果使用zsh需要使用
vim ~/.zshrc
在文件末
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
然后source ~/.zshrc
使設置生效。
- 不發送本地的locale到遠程的主機
編輯 vim /etc/ssh/ssh_config
找到SendEnv LANG LC_*
注釋掉
# SendEnv LANG LC_*
關閉iTerm2再連接也可以。
第一種方法是根本解決之法
2019/4/27 更新
第三種情況,本地機locale
正確發送的情況下,遠程服務器沒有正確的locale
。
最近在使用Proxmox VE,在使用LXC模板創建的debian容器中又出現上述問題,這一次情況是容器本身的locale是只有
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
遠程服務器沒有正確設置locale,結果就是無法正確的顯示非英文字符
未正確設置locale
而Mac本身確實發送了正確的LC*
, 這樣的情況下要采用如下操作:
- 登錄到服務器,輸入
locale -a
可生成的 Locale 保存在 /etc/locale.gen 中,用以下的格式來定義:
[language][_TERRITORY][.CODESET][@modifier]. 要開啟某個Locale,反注釋對應的行即可。
- 查看有沒有 en_US.UTF-8,如果沒有則執行第3步
- 編輯
/etc/locale.gen
文件,反注釋en_US.UTF-8 UTF-8
一行. - 執行生成命令
locale-gen
-
斷開ssh,然后重新連接即可,之前不能正確顯示的中文字符就可以顯示了
正確設置locale
如果locale-gen沒有安裝則安裝該包
apt-get install -y locales locales-all
參考: