CentOS 虚拟机乱码的根源,绝大多数是语言环境变量没配好,或者 SSH 工具的字符集与系统不对齐,修复并不复杂。 先分清是终端乱码、文件内容乱码,还是开机启动时控制台乱码,再对症下药,能省下大量重装系统的冤枉时间。
CentOS7虚拟机中文乱码:先确认是系统乱码还是客户端乱码
很多朋友遇到乱码第一反应是系统坏了,其实超过一半的情况是客户端显示问题,你在 Windows 上用 Xshell、SecureCRT 连接 CentOS 虚拟机,如果系统内部语言是 UTF-8,而客户端强制使用 GBK 解码,中文自然显示成乱码,反过来,系统语言是 GBK,客户端用 UTF-8 也一样花屏。
快速判断方法:在命令行敲 locale 查看输出,如果显示 LANG=en_US.UTF-8,说明系统层面没设置中文,这种不算乱码,只是没装中文包,如果显示 LANG=zh_CN.UTF-8 但中文仍是乱码,问题出在 SSH 客户端的编码设置上。locale 命令本身输出的字符就是乱码,那才是系统真正的字符集损坏。
- 系统文件里的中文乱码:多半是编辑器编码与文件实际编码不符
- 命令行提示中文乱码:多半是 locale 环境变量缺失
- 开机滚动日志乱码:多半是 vconsole 或 grub 字体问题
CentOS虚拟机乱码原因排查:先看环境变量再看编码
检查 locale 是否完整
行业共识:CentOS 7 默认最小化安装不生成任何中文 locale,只带 en_US.UTF-8 和 POSIX,你在安装时如果选了中文,系统会自动生成 zh_CN.UTF-8,但如果你用的是精简版镜像或者自定义安装,往往只装了英文包装,中文环境自然是缺失的。
locale -a | grep zh_CN
如果没有任何输出,说明系统里根本没有中文字符集,需要手动安装或生成。
检查系统当前语言设置
echo $LANG cat /etc/locale.conf
/etc/locale.conf 是 CentOS 7 系统中的全局语言配置文件,SSH 登录会话会读取它,如果这里写的是 LANG=en_US.UTF-8,那么即使你本地终端是中文系统,远程执行命令返回的中文提示也会变成英文或乱码,这不是系统坏了,只是语言配置没切到中文。
检查 SSH 客户端编码
如果你用的是 Xshell、FinalShell、MobaXterm 这类工具,它们都有自己的编码设置。具体操作路径:Xshell 里右键当前会话 -> 属性 -> 终端 -> 编码,改成 UTF-8,SecureCRT 则在 选项 -> 会话选项 -> 外观 -> 字符编码 里修改,这一步常常被忽略,但属于最常见的乱码根因。
CentOS乱码怎么解决:三种场景对应三种命令组合
系统没有中文字符集,通过 localedef 即时生成
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8
执行完毕后运行
locale -a 确认出现 zh_CN.utf8,这是在不联网的前提下手动生成中文字符集的路径,不需要安装额外软件包,生成完成后,临时生效可以执行:
export LANG=zh_CN.UTF-8
然后运行 date 看看月份是否显示为中文,如果还是英文,说明你的 SSH 工具覆盖了 LANG 变量,去调整客户端编码,如果显示中文,说明系统层面已经支持,接下来要做的是永久写入配置。
永久写入全局语言配置
echo 'LANG=zh_CN.UTF-8' > /etc/locale.conf source /etc/locale.conf
这里有一个容易踩的坑:不要手动修改 /etc/sysconfig/i18n,那是 CentOS 6 的配置文件,CentOS 7 上改了不生效,部分服务器商提供的 CentOS 7 镜像可能在 /etc/environment 里也写了语言设置,需要一并检查:
cat /etc/environment
如果这里存在 LANG=en_US.UTF-8 且与 /etc/locale.conf 冲突,部分程序会优先读取 /etc/environment,建议将两处统一为同一值。
仅针对某个用户修改语言
如果只有 root 账号乱码,其他账号正常,那就写在用户级配置里,编辑 /root/.bashrc,加入:
export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8
注意:LC_ALL 是最高优先级的环境变量,它会覆盖 LANG 和所有 LC_ 系列变量,如果你设置了 LC_ALL,那么单独设置 LANG 没有意义,建议只设置 LANG,不要设置 LC_ALL,因为强制覆盖可能导致某些英文程序的格式化输出异常。
虚拟机终端显示乱码:排查方向与物理机不同
在物理服务器上,乱码一般通过 SSH 修复,但在本地虚拟机里,还存在一个额外的图形控制台问题,如果你直接在 VMware Workstation 或 VirtualBox 的虚拟机窗口里操作,语言环境变量没问题但启动时满屏黑底白字的问号方块,这是内核控制台字符集的问题。
- 执行
systemctl start systemd-vconsole-setup重新加载终端字体映射 - 检查
/etc/vconsole.conf,确认FONT字段指向存在的字体文件 - 如果使用最小化安装,
/etc/vconsole.conf可能为空,需要写入:
FONT=euro.pcf.gz KEYMAP=us
euro.pcf.gz 是内核自带的标准字体,对 UTF-8 编码支持较好,默认的 latarcyrheb-sun16 在部分 CentOS 7 虚拟机上对中文显示支持不佳,换成 euro.pcf.gz 后控制台中文提示往往能正常显示。
具体操作路径:
vi /etc/vconsole.conf FONT=euro.pcf.gz reboot
重启后观察开机的服务启动日志,中文字符如果仍显示为方块,那就是 VMware 或 VirtualBox 的虚拟显卡驱动对字体渲染的问题,建议直接改用 SSH 连接查看,控制台的显示问题不影响系统实际功能。
Linux虚拟机乱码和Windows宿主机之间的剪贴板编码冲突
这个场景非常容易被忽略,你在 Windows 宿主机上复制一段中文文本,粘贴进 CentOS 虚拟机终端,显示出来是乱码,这不是系统语言问题,而是 Windows 剪贴板默认编码为 GBK,而 Linux 终端接收时按 UTF-8 解析,两边的字符集不一致。
解决方法是设置终端的粘贴行为:Xshell 在 工具 -> 选项 -> 键盘鼠标 里勾选“粘贴时转换编码”,或者先粘贴到 vi 编辑器里再用 set fileencoding 转换,在 SecureCRT 中则可以通过 会话选项 -> 终端 -> 仿真 -> Paste 编码 调整,多数情况下属于客户端软件层面的编码转换问题,无需改动系统 locale。
忘记安装中文语言包的情况下,用 yum 补装
如果上面所有步骤都正确,但某些程序仍显示乱码,可能是缺少相应语言包,CentOS 7 有专门的中文支持组:
yum groupinstall "Chinese Support" -y
这个命令会安装中文字体、翻译文件、im-chooser 等组件,安装完成后重新登录会话即可生效。注意:该命令需要服务器能访问 yum 仓库,如果你的虚拟机没有外网且没挂载本地光盘源,会报错,离线环境下建议优先使用 localedef 方案,不需要任何额外的 rpm 包。
局域网内离线环境的中文包本地安装路径
在没有外网的机房环境中,比较实际的做法是在同版本并且已经装好中文支持的机器上,使用 rpm -qa | grep lang 查看语言包列表,再用 yumdownloader 下载对应 rpm 包,拷贝到目标虚拟机离线安装,这个过程虽然繁琐,但虚拟机充其量也就几个 GB 的磁盘空间,相比直接重装系统还是省时不少,如果你用的是深圳或北京的机房服务器,这个操作同样适用只要保证 CentOS 版本一致即可。
启动菜单 grub 显示乱码的特殊处理
少数情况下,开机时 grub 引导菜单本身乱码,这属于 boot 阶段的字符集问题,与进入系统后的 locale 无关,CentOS 7 默认 grub2 的字体文件位于 /boot/grub2/fonts/,如果该目录缺失或者损坏,引导菜单就会显示为乱码或方块,修复方式:
yum reinstall grub2-common grub2-mkconfig -o /boot/grub2/grub.cfg
如果你平时很少直接看虚拟机控制台,都是用 SSH 管理,grub 乱码不影响生产环境运行,但如果虚拟机在私有云平台上通过 VNC 访问,grub 乱码会导致屏幕无法阅读,进一步排查也需要一定时间。
表格对比:三种乱码类型的修复路径差异
| 乱码类型 | 典型表现 | 直接修复位置 | 验证命令 |
|---|---|---|---|
| locale 缺失 | 中文全部显示为??号 | /etc/locale.conf | locale -a |
| SSH客户端编码 | 终端显示菱形或方块 | Xshell/SecureCRT 编码选项 | 直接在客户端切换编码测试 |
| 控制台字体 | 虚拟窗口内启动日志方块 | /etc/vconsole.conf | systemctl restart systemd-vconsole-setup |
修复顺序建议优先从 SSH 客户端编码入手,因为这是成本最低、效果最直观的验证路径,如果确认客户端无误,再检查系统的 locale 配置。不要一上来就重装系统,在多数情况下属于字符集配置问题而非系统文件损坏。
本身的乱码,别误伤系统配置
有时候你 cat /etc/hosts 看到注释乱码,或者查看之前从 Windows 上传的脚本文件出现乱码,这不属于系统乱码,而是文件编码与终端编码不匹配,Windows 记事本保存的 txt 文件往往是 GBK 编码,Linux 的 vim 默认按 UTF-8 打开,中文自然出错,这种情况下可以直接在 vim 里转码:
vim file.txt :set fileencoding=utf-8 :wq
重新打开文件内容就正常了,如果只是临时查看,不改动文件本身,可以用 iconv -f GBK -t UTF-8 file.txt 输出到屏幕,这个命令在查看旧日志、Windows 上传的配置文件、以及处理 MongoDB 或 MySQL 导出的备份数据时经常用到。
dump 文件和数据库导出文件的编码转换则更需要注意,通常在导出阶段就指定字符集,而不是事后转换,mysqldump 时加上 --default-character-set=utf8mb4,否则备份文件内部乱码,恢复后会引发连锁问题。
CentOS 虚拟机乱码问题解答
CentOS7 虚拟机乱码后需要重装系统吗
不需要,绝大多数乱码是 locale 变量、SSH 客户端编码或文件编码三选一引起,重装系统反而会清掉你安装的软件和环境配置,按本文顺序排查,五分钟内基本能定位根源,ssh 登录也乱码且 locale 完全损坏,可以通过 systemd.unit=multi-user.target 进入单人维护模式修复 /etc/locale.conf,不需要重装。
为什么 Xshell 连接 CentOS 后中文全是问号
Xshell 的默认编码在部分版本里是默认语言,如果你的 Windows 系统语言是中文,Xshell 可能使用 GBK 编码连接,CentOS 7 的 zh_CN.UTF-8 locale 输出 UTF-8 字节流,GBK 解码时中文资源无法映射,显示为问号,将 Xshell 会话属性中的终端编码改为 UTF-8,断开重连即可正常。
VMware 里安装 CentOS 时选择英文语言,后面还能改中文界面吗
可以,安装时选英文只影响安装过程和初始 locale,装完后执行 yum groupinstall "Chinese Support" -y 并修改 /etc/locale.conf 为 LANG=zh_CN.UTF-8,重新登录后界面就是中文,图形化桌面环境还需要额外安装 langpacks-zh_CN 和合适的字体包,纯命令行环境下上述两个步骤足以解决乱码问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/641654.html




