核心原因:本地 Mac 终端编码、系统 locale、SSH 环境变量转发、远程 Linux 服务器字符集四方编码不统一(必须全部统一为 UTF-8),乱码表现:中文方框□、问号?、字符错位、特殊符号乱码、退出终端后本地字符错乱。
一、临时一键修复(立刻生效,适合应急)
1. SSH 连接时强制指定 UTF-8 编码
bash
运行
# 连接时携带编码环境变量
ssh -o SendEnv=LANG,LC_ALL user@服务器IP
# 简写方式
LANG=en_US.UTF-8 ssh user@IP
2. 终端异常字符错乱(卡死 / 强制退出后乱码)
执行命令重置终端控制台:
bash
运行
stty sane
瞬间恢复按键、字符显示正常CSDN博…。
二、本地 Mac 永久配置(最关键第一步)
macOS 默认 Shell 为 zsh(10.15+),bash 老系统参考注释。
步骤 1:配置系统 locale 全局 UTF-8
- 编辑 Shell 配置文件
bash
运行
vim ~/.zshrc
# 老bash系统用:vim ~/.bash_profile
- 文件末尾粘贴三行:
bash
运行
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
也可写
zh_CN.UTF-8,英文 UTF8 兼容性更强,极少报错
- 生效配置
bash
运行
source ~/.zshrc
# bash: source ~/.bash_profile
- 验证是否成功
bash
运行
locale
所有字段末尾必须带 UTF-8 才算正常。
步骤 2:修改 SSH 全局配置,允许转发编码环境变量
让 SSH 把本地 UTF-8 编码传给远程服务器:
bash
运行
sudo vim /etc/ssh/ssh_config
找到 Host * 区块,修改 / 添加:
plaintext
Host *
SendEnv LANG LC_*
保存退出;
若报错
cannot change locale (UTF-8),替换为固定值:
SendEnv LANG LC_ALL=en_US.UTF-8
步骤 3:终端软件编码 & 字体设置(二选一)
① Mac 自带「终端 Terminal」
- 顶部菜单:终端 → 设置 → 高级
- 文本编码:选择 Unicode (UTF-8)
- 文本页:字体选用 PingFang SC、Menlo、苹方(支持中文渲染)
② iTerm2(最常用第三方终端)
Preferences → Profiles → Text- 字体:等宽字体 + 非 ASCII 字体选苹方 / 思源黑体
Profiles → Terminal → Character Encoding:UTF-8Advanced开启:Prefer UTF-8 for clipboard解决中文粘贴乱码
三、远程 Linux 服务器端配置(缺一不可)
服务器默认多为 C/POSIX 编码,不识别 UTF8 中文,必须修改:
1. 临时生效(当前会话)
SSH 登录服务器后执行:
bash
运行
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
2. 永久写入服务器环境变量
CentOS/RHEL:
bash
运行
vim /etc/profile
# 末尾添加
export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
source /etc/profile
Ubuntu/Debian:
bash
运行
vim ~/.bashrc
# 末尾添加编码变量,source生效
3. 开启 sshd 接收本地编码变量
编辑服务器 ssh 服务配置:
bash
运行
vim /etc/ssh/sshd_config
# 确保存在这一行(没有就加上)
AcceptEnv LANG LC_*
# 重启ssh服务
# CentOS: systemctl restart sshd
# Ubuntu: systemctl restart ssh
4. 服务器生成 UTF-8 语言包(缺失 locale 时报错必备)
bash
运行
# Ubuntu/Debian
locale-gen en_US.UTF-8
# CentOS
localedef -c -i en_US -f UTF-8 en_US.UTF-8
四、特殊场景:老服务器 GBK 编码兼容(极少用)
如果老旧服务器只能用 GBK 编码:
本地终端编码改为 GBK,两边统一即可,但强烈推荐全站 UTF8。
五、排查自检流程(按顺序核对)
- Mac 本地
locale→ 全 UTF8 ✅ - 终端软件编码:UTF8 ✅
/etc/ssh/ssh_config开启 SendEnv ✅- 服务器
locale→ 全 UTF8 ✅ - 服务器 sshd_config 开启 AcceptEnv ✅
- 乱码应急:
stty sane
全部配置完成后,重启终端重新 SSH 连接,中文文件名、日志、提示符都会正常显示。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)