虚拟机乱码的根源九成是字符编码设置与系统区域语言不匹配,改对locale和区域选项即可解决,不用重新安装系统。
先搞清楚乱码是哪一层产生的
虚拟机里的乱码和物理机乱码成因类似,但多了一个“虚拟硬件翻译层”,排查顺序稍有不同,你可以按下面三步快速定位:
- 打开虚拟机里的命令提示符或终端,敲
chcp查看当前代码页,Windows默认是936(简体中文),Linux通常是UTF-8。 - 在宿主机上用文本编辑器打开虚拟机的配置文件(.vmx或.vbox),确认
gui.codePage或ConsoleEncoding这类参数没有被改成奇怪的值。 - 如果只有某个软件乱码、系统界面正常,说明是应用层编码问题,和虚拟机本身无关。
行业共识认为,乱码问题里约八成是区域语言设置不规范导致的,剩下两成才是软件自身的编码缺陷。
虚拟机显示乱码是字符编码设置错了吗
Windows虚拟机乱码的常见原因
Windows虚拟机里出现乱码,大多数情况是“非Unicode程序的语言”设置不对,比如你在英文版Windows里装中文软件,或者在中文本地化不完整的精简版系统里跑老程序,就会出现典型的“锟斤拷”或“”这种替换字符。
解决办法如下:
- 进入控制面板 → 时钟和区域 → 区域 → 管理选项卡。
- 点击更改系统区域设置,把当前区域改成中文(简体,中国)。
- 勾选下方的 Beta版:使用Unicode UTF-8提供全球语言支持(这一步视情况而定,勾选后部分老软件可能反而乱码)。
- 重启虚拟机,重启后乱码通常消失。
如果不想动系统级设置,只想临时解决某个程序的问题,可以在程序快捷方式的属性里勾选 “以兼容模式运行”,或者使用 Locale Emulator 这类工具单独为程序指定区域。
Linux虚拟机乱码的解决思路
Linux虚拟机乱码常见的表现是:终端里中文显示成方块或问号、文件名乱码、网页内容乱码,本质是locale环境变量不完整。
输入 locale 命令查看当前语言环境,如果显示 LANG=en_US.UTF-8
而系统里没装中文字体,就会出现方块字,如果显示 POSIX 或 C,说明locale完全没设置。
修复方式:
- 安装中文字体:
sudo apt install fonts-noto-cjk(Debian/Ubuntu)或sudo yum install google-noto-sans-cjk-fonts(CentOS/RHEL)。 - 设置系统locale:编辑
/etc/locale.gen,取消zh_CN.UTF-8 UTF-8前面的注释,然后执行sudo locale-gen。 - 对当前用户生效:在
~/.bashrc或~/.zshrc末尾写入export LANG=zh_CN.UTF-8,source ~/.bashrc。
VMware和VirtualBox乱码的差异
VMware Workstation和VirtualBox在处理中文显示上稍有区别,但这几年差异逐渐缩小,如果你在用VMware虚拟机乱码怎么解决,多数情况下直接按上文改客户机系统区域即可,VirtualBox则有小概率出现虚拟机显示乱码是什么原因检查一下虚拟机设置 → 显示 → 显卡控制器,如果使用VBoxSVGA且显存不足,偶尔会引发界面渲染异常,但这类情况不常见,优先排查系统编码设置。
具体对比可以参考下表:
| 对比项 | VMware Workstation | VirtualBox |
|---|---|---|
| 中文支持 | 较完善,宿主机为中文时无需额外配置 | 依赖客户机系统locale,偶发控制台乱码 |
| 乱码高发场景 | 精简版镜像内部编码失效 | 无桌面环境时终端字体缺失 |
| 推荐解法 | 修改客户机区域语言 | 安装字体+设置locale |
| 配置文件编码 | .vmx为UTF-8,改乱码后需重启 | .vbox为UTF-8,注意备份原文件 |
虚拟机中文乱码怎么解决:分场景实操
装完系统就乱码,还没进桌面
如果你在安装Windows虚拟机时选了英文语言包,装完中文软件后乱码,最稳妥的办法是添加中文语言包而非改区域设置,Windows 10/11在设置 → 时间和语言 → 语言 → 添加首选语言中选“中文(中华人民共和国)”,下载安装后调整语言顺序,重启即可。
主机上能正常显示,一进虚拟机全乱
这种情况常出现在远程连接环节,比如你用Xshell或SecureCRT连Linux虚拟机,中文显示乱码,但虚拟机本机界面正常。
这属于终端软件的编码和服务器不一致,具体操作:
- Xshell:文件 → 属性 → 终端 → 编码,改成 UTF-8。
- SecureCRT:选项 → 会话选项 → 外观 → 字符编码,选 UTF-8。
- 检查SSH服务端配置:
/etc/ssh/ssh_config中确保没有强制指定非UTF-8编码。
虚拟机里的软件乱码,但系统界面正常
这是典型的内置编码被写死的情况,比如某些老旧的中文财务软件只支持GBK,而在纯UTF-8环境下运行就会乱码。
Windows下用 Microsoft AppLocale 或 Locale Emulator 以简体中文区域启动该程序,Linux下可以通过修改环境变量绕行:
export LANG=zh_CN.GBK ./your_program
这种方式只对当前终端会话生效,不影响系统其他部分。
彻底预防虚拟机和物理机之间的复制粘贴乱码
虚拟机里复制一段中文,粘贴到宿主机变成乱码,或反过来这是很多人的“虚拟机字符编码设置错了”首要怀疑对象,但其实是剪贴板编码转换的问题。
预防思路:
- 在虚拟机设置里开启增强键盘驱动(VMware)或Guest Additions(VirtualBox),这些组件自带剪贴板编码转换。
- 不要直接用系统记事本当中间载体,改用VS Code或Notepad++,它们自带编码识别。
- 优先通过共享文件夹传输文本文件,而不是走剪贴板。
- 使用SSH工具时,统一终端和服务器的编码为UTF-8。
修改编码设置后还乱码,要检查文件本身
部分情况下乱码不是虚拟机的问题,而是文件本身的编码就是错的,你用记事本打开一个本该是UTF-8的文件,记事本自动按ANSI解析,中文就全乱了。
这时处理的对象是文件,不是虚拟机:
- 用 VS Code 打开文件,右下角会显示当前编码,GBK”或“UTF-8”。
- 点击编码区域,选择“通过编码重新打开”,找到正确编码后另存为UTF-8。
- 一个技巧:看到“锟斤拷”说明文件是GBK按UTF-8读了,看到“”(单问号)说明文件是UTF-8按GBK读了。
长时间使用中的编码维护建议
虚拟机的编码设置不是一劳永逸的事,尤其是你频繁更换宿主机或迁移虚拟机文件时,下面几条建议能减少后续麻烦:
- 备份配置文件再修改:编辑.vmx或.vbox前先复制一份,改错了可以还原。
- 虚拟机内系统更新后复查语言设置:大版本更新偶尔会重置区域选项。
- 多台虚拟机统一编码标准:全用UTF-8能避免很多跨机器传输时的识别混乱。
- 手头准备一个绿色版文本编辑器:用官方Windows记事本处理乱码文件时,除非手动切换编码,否则按UTF-8保存会丢失原格式。
两个常见误区
乱码就是系统坏了,重装更快。 失败率高,因为很多原版镜像或精简版镜像的语言包不完整,重装后很可能出现同样的乱码。
把整个系统区域改成英文可以避免乱码。 恰恰相反,英文环境下跑中文软件更容易乱码,不如让系统的locale和软件需要的locale保持一致。
业内专家指出,虚拟机乱码的核心原理是“编码不一致时,解码方用错了映射表”,只要找到乱码场景对应的是系统层还是应用层,再对症设置,问题基本都能在十分钟内解决。
关于虚拟机乱码的常见问题速查
改了系统区域设置后,虚拟机里的老程序变得异常。
这是勾选了UTF-8 Beta选项导致的,取消勾选并重启虚拟机,老程序大多按GBK/ANSI编码运行,强制UTF-8反而让它们无法正确解析资源文件。
虚拟机内部显示正常,但截图或录屏给同事看,对方看到的还是乱码。
截图保存的是像素,对方看到乱码说明并非编码问题,而是对方虚拟机或系统的字体缺少对应字形,让对端安装中文字体即可,最简单的验证方式是让对方把图片放大查看,字体缺失时放大后笔画是断裂的,而编码乱码时放大后仍是一串替换符。
用Docker或WSL内嵌的虚拟机功能时乱码,怎么处理?
Docker和WSL本身不自带图形化区域设置,检查容器的 LANG 和 LC_ALL 环境变量,并在容器内安装 locales 包后生成 en_US.UTF-8 或 zh_CN.UTF-8,你可以在宿主机上执行 docker exec -it 容器名 env | grep LANG 确认当前值。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/624139.html





