虚拟机里频繁蹦出乱码,核心原因只有一个:字符编码不一致。 不管是宿主机、虚拟机系统、还是终端工具,只要有一层用的编码和文件实际编码对不上,中文就会变成英文乱码或方块,下面按“排查原因具体操作日常预防”的顺序,帮你把这个问题彻底按死。
虚拟机中文乱码修复:先检查字符编码
乱码不是随机故障,它一定是某个环节的编码设置出了问题,多数情况是系统语言环境(locale)是英文,而文件或终端输入是中文,也有可能是远程连接工具用了旧版编码,比如GBK和UTF-8互相不认。
查看当前系统的语言环境
先在虚拟机里打开终端,输入下面这个命令,看系统默认语言是什么:
locale
重点看 LANG= 这一行,如果输出是 en_US.UTF-8 或 C.UTF-8,那么系统默认语言就是英文,当你要显示中文字符时,缺少中文语言包就会显示成乱码或问号。
Windows虚拟机同样有这个问题,打开命令提示符,输入:
chcp
输出如果是 936,说明当前是GBK编码,如果输出 65001,则是UTF-8,多数乱码源于程序输出是UTF-8,但控制台按GBK解析。
临时切换编码验证问题
不用重启,直接在终端里临时修改语言环境测试:
export LANG=zh_CN.UTF-8
然后再执行一个之前乱码的命令,ls -l 或打开某个文件,如果中文恢复正常,说明就是环境变量没配对,这种修改只对当前终端会话有效,重启后失效,适合用来做快速验证。
修改系统默认语言配置
验证是环境变量的问题后,就把系统默认语言永久改掉,Ubuntu或Debian系用:
sudo update-locale LANG=zh_CN.UTF-8
CentOS或RHEL 7及以上用:
sudo localectl set-locale LANG=zh_CN.UTF-8
改完执行 source /etc/default/locale 或者直接重启虚拟机,再用 locale 检查确认。
行业共识认为,服务器端推荐保留英文locale,业务上需要中文显示时才单独设置应用层编码,这样能减少兼容性冲突。
虚拟机英文乱码怎么解决?三个关键操作
如果你已经在终端里看到一堆类似 这样的字符,或者干脆全是英文字母和数字混排,那就是典型的UTF-8编码被按其他编码解读,解决思路不复杂,就三步。
第一步:安装中文语言包和字体
没有中文字体,就算编码对也会显示成方块或空白,Ubuntu系执行:
sudo apt install language-pack-zh-hans fonts-noto-cjk
CentOS系执行:
sudo yum groupinstall "Chinese Support"
如果虚拟机跑的是Windows系统,需要在“设置时间和语言语言”里添加“中文(简体)”并勾选“设置为显示语言”,系统会下载语言包,这一步做完,乱码源头大概率就消除了。
第二步:修改终端仿真器的编码
很多乱码不是虚拟机系统的问题,而是你用来连接虚拟机的软件编码不对,Xshell、SecureCRT、MobaXterm这几款主流终端都默认支持UTF-8,但旧配置可能停留在GBK。
Xshell的操作路径是:会话属性终端编码,选择UTF-8。
SecureCRT的操作路径是:选项会话选项外观字符编码,选择UTF-8。
Windows Terminal则需要在配置文件里确认 "encoding": "utf-8",或者直接在命令行执行:
chcp 65001
改完重开会话,再看那些乱码文本,基本能正常显示。
第三步:统一SSH传输编码
如果你是通过SSH连接虚拟机,那么客户端发送的LANG变量会和服务器不一致,打开 /etc/ssh/ssh_config,找到或添加这一行:
SendEnv LANG LC_
同时确认服务器的 /etc/environment 中写的也是UTF-8,这样SSH会话建立时,两边语言环境就同步了。
业内专家指出,SSH乱码中大概有七成是终端编码设置不对,而不是服务器没有语言包,先改终端设置,比重装语言包更省时间。
不同虚拟机场景下的乱码处理清单
乱码在Linux虚拟机和Windows虚拟机上的表现不同,处理侧重点也不同,下表列出了常见场景和对应的第一操作优先级:
| 场景 | 常见现象 | 首选操作 | 次选操作 |
|---|---|---|---|
| Linux虚拟机+SSH | 中文显示为英文乱码 | 终端编码改为UTF-8 | 安装中文语言包 |
| Linux虚拟机+本地桌面 | 文件夹名称乱码 | 设置locale为zh_CN.UTF-8 | 安装中文字体 |
| Windows虚拟机 | 应用程序界面乱码 | 控制面板切换显示语言 | 安装语言包 |
| 容器或K8s环境 | 日志中文乱码 | 设置环境变量LANG | 重建容器时指定编码 |
Linux虚拟机的具体排查路径
先检查locale,再检查文件本身的编码,执行:
file -i 文件名
输出里有 charset=utf-8 说明是UTF-8,如果输出 us-ascii 或 iso-8859-1,说明文件编码不对,这时可以用 iconv 转换:
iconv -f GBK -t UTF-8 原文件 > 新文件
Windows虚拟机的具体排查路径
右键点击“此电脑”属性高级系统设置,在“区域”选项卡里把“系统区域设置”改为“中文(简体,中国)”,并且不要勾选“Beta版:使用Unicode UTF-8提供全球语言支持”,这个选项对老旧软件兼容性不好,改完重启虚拟机。
避免乱码的日常习惯
乱码容易反复,是因为大家习惯沿用旧配置,下面几个做法能显著降低复发概率。
- 写脚本或配置文件时统一声明编码。 Python文件头部写
# -- coding: utf-8 --,Shell脚本不要混用CRLF和LF行尾。 - 压缩和传输文件时指定编码。 用zip时加
-UTF-8参数,用tar时保持系统环境变量一致。 - 数据库连接字符串里写清楚编码。 比如MySQL连接加
?characterEncoding=utf8,否则数据从虚拟机写入数据库时很容易变成乱七八糟的英文。 - 别把locale设置成
C或POSIX。 这两个值是系统最底层的默认值,完全不处理多字节字符,遇到中文必然出乱码。
Q&A:虚拟机乱码如何彻底解决?
为什么虚拟机的中文文件名在宿主机上显示乱码?
这通常是因为虚拟机的文件系统使用了编码A写入文件名,而宿主机用编码B读取,比如Ext4默认UTF-8,Windows默认GBK,虚拟磁盘直接挂载到宿主机时就容易乱,解决方法是不要直接挂载虚拟磁盘,优先通过Samba共享或SSH传输文件,这两种方式会携带编码协商机制。
xshell连接虚拟机显示乱码怎么办?
先确认xshell的会话编码是UTF-8,再确认服务器端locale不是LANG=en_US,两者都正确后,断开重连,如果仍然乱码,在ssh命令后手动指定语言环境:ssh -o SendEnv=LANG LC_ 用户名@IP,然后输入export LANG=zh_CN.UTF-8。
Linux虚拟机终端出现方块和问号如何处理?
方块多半是缺字体,问号多半是编码问题,先执行fc-list | grep -i "Noto.CJK"检查是否安装Noto CJK字体,没装就安装,字体没问题就检查终端软件的字符编码,把终端从默认的“本地编码”改成UTF-8,改完重启终端,方块和问号会一起消失。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/924253.html


评论列表(4条)
读了这篇文章,我深有感触。作者对比如的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@音乐迷cyber693:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是比如部分,给了我很多新的思路。感谢分享这么好的内容!
@lucky808girl:这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于比如的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于比如的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!