终端输出中文乱码的根本原因是jvm未正确读取utf-8环境变量,导致file.encoding为ansi_x3.4-1968;需修改phpstorm.sh导出lang/lc_all,并在run配置中添加-dfile.encoding=utf-8。

终端输出中文乱码是因为 JVM 没读到 UTF-8 环境
PHPStorm 内置 Terminal 或运行 PHP 脚本时中文变问号、方块或乱码,根本原因不是字体问题,而是 Java 进程启动时没拿到 LANG 和 LC_ALL 的 UTF-8 值,导致 System.getProperty("file.encoding") 返回 ANSI_X3.4-1968(即 US-ASCII)这类错误编码。即使系统 locale 显示正常,JVM 也可能忽略它。
- 先验证:在 Terminal 中执行
echo $LANG和java -XshowSettings:properties -version 2>&1 | grep file.encoding,对比两者是否一致 - 临时修复:在 Terminal 里手动执行
export LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8,再运行脚本看是否恢复 - 永久生效必须让 PHPStorm 启动时就加载这些变量,不能只靠 shell 配置文件(
~/.bashrc在 GUI 应用中常不生效)
必须改 phpstorm.sh 才能真正生效
CentOS/Debian/Ubuntu 下,PHPStorm 的 GUI 启动不继承终端的 locale,直接改 ~/.bashrc 或 /etc/locale.conf 对内置 Terminal 和 Run 配置无效。唯一可靠方式是修改启动脚本。
- 找到安装目录下的
bin/phpstorm.sh(如/opt/PhpStorm-233.14475.56/bin/phpstorm.sh) - 在
#!/bin/sh下方**紧贴第一行**插入:export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8
- 保存后完全退出 PHPStorm(包括托盘进程),再重新启动
- 重启后进 Terminal 执行
env | grep -E 'LANG|LC',确认变量已存在
Run 配置里还要加 -Dfile.encoding=UTF-8
即使环境变量正确,PHP 脚本通过 Run Configuration 执行时,JVM 仍可能按平台默认编码解析字节流,尤其涉及 file_get_contents()、json_encode() 或日志写入时。
- 打开
Run > Edit Configurations - 选中你的 PHP Script / CLI 或 Web Server 配置
- 在
Configuration标签页的VM options输入框里填入:-Dfile.encoding=UTF-8 - 不要写成
-Dfile.encoding=utf8(大小写敏感,必须全大写UTF-8) - 若使用 Xdebug,该参数同样有效;但注意它**不作用于 PHP 自身的
default_charset,仅影响 JVM 层字节处理**
Terminal 字体本身不影响中文显示,但影响 UI 方块
如果 Terminal 里中文显示为“□□□”,不是编码问题,而是 Java 渲染时找不到中文字体 fallback。此时改字体只是补救,不能替代编码配置。
- 先确保已安装中文字体(如 CentOS:
sudo yum install cjkuni-ukai-fonts;Debian:sudo apt install fonts-wqy-zenhei) - 在
File > Settings > Tools > Terminal中,Shell path保持默认(如/bin/bash),不用改 -
Font设置项可留空(由系统控制),重点是让 Java 能 fallback 到已安装字体——这依赖前面两步的export和fontconfig.properties修正 - 若仍方块,需手动编辑 JetBrains 运行时的
jre/lib/fontconfig.properties,添加中文字体路径映射(较深,通常前几步已覆盖 95% 场景)
最容易被忽略的是:改完 phpstorm.sh 后没杀干净后台进程,或者 VM options 拼错成 utf8。这两处一错,其他所有设置都白做。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










