PhpStorm 中文乱码需四层统一:系统 locale、JVM 启动参数、Run Configuration 的 -Dfile.encoding=UTF-8、PHP 脚本中 mb_internal_encoding('UTF-8'),缺一不可且须彻底重启验证。

PhpStorm 运行 PHP 脚本时中文变问号、方块或乱码,不是改个「Console Encoding」就能好——根本原因是系统 locale、IDE 内置终端、JVM 启动参数、PHP 运行时四者编码不一致。只调其中一环,重启后大概率复现。
确认系统 locale 是否真正生效
PHPStorm 的 GUI 进程不继承 shell 的 ~/.bashrc,即使你在终端里 echo $LANG 看到 zh_CN.UTF-8,IDE 启动的 Terminal 仍可能是 C 或空值。
- 在 PhpStorm Terminal 中执行:
locale,若输出中LANG=为空或LANG=C,说明没生效 - CentOS 7/8:运行
sudo localectl set-locale LANG=zh_CN.UTF-8,然后重启系统或至少登出重登录 - Ubuntu/Debian:用
sudo update-locale LANG=zh_CN.UTF-8,再检查/etc/default/locale - 验证是否写入成功:重启后在 Terminal 执行
env | grep -E 'LANG|LC',必须看到LANG=zh_CN.UTF-8和LC_ALL=zh_CN.UTF-8
修改 phpstorm.sh 强制 JVM 加载 UTF-8 环境
仅设系统 locale 不够,Java 进程启动时若没读到 LANG,System.getProperty("file.encoding") 会 fallback 到 ANSI_X3.4-1968(即 ASCII),导致所有字节流解析错位。
- 找到 PhpStorm 安装目录下的
bin/phpstorm.sh(如/opt/PhpStorm-233.14475.56/bin/phpstorm.sh) - 在
#!/bin/sh下方**紧贴第一行**插入两行:export LANG=zh_CN.UTF-8export LC_ALL=zh_CN.UTF-8 - 保存后**完全退出 PhpStorm**(包括托盘进程),再重新启动
- 重启后进 Terminal 执行
java -XshowSettings:properties -version 2>&1 | grep file.encoding,输出应为file.encoding = UTF-8
Run Configuration 必须加 -Dfile.encoding=UTF-8
即使环境变量和 JVM 都对了,PhpStorm 通过 Run Configuration 执行脚本时,仍可能绕过系统 locale,按平台默认编码处理 I/O——尤其是 file_get_contents()、json_encode()、日志写入等操作。
- 打开
Run > Edit Configurations,选中你的 PHP Script 配置 - 在
Configuration标签页的VM options输入框中填入:-Dfile.encoding=UTF-8(注意大小写,不能写utf8或utf-8) - 该参数对 Xdebug 也生效,但不影响 PHP 的
default_charset,只约束 JVM 层字节流解码 - 若项目含 .properties 文件,此项还能避免
ResourceBundle加载失败
PHP 运行时层补一手 mb_internal_encoding
上面三层都对了,但脚本里用了 mb_* 函数(比如 mb_strlen()、mb_substr()),而 mb_internal_encoding() 没显式设为 UTF-8,仍可能因 php.ini 中的 mbstring.internal_encoding 被覆盖而出错。
- 在脚本开头加:
mb_internal_encoding('UTF-8'); - CLI 下验证:
php -r "echo mb_internal_encoding();",输出必须是UTF-8 - 如果返回空或
ISO-8859-1,检查php.ini中是否有mbstring.internal_encoding = ...行,并注释掉或改为UTF-8 - 注意:此设置只影响 mbstring 函数族,不影响 echo / var_dump 的原始输出编码
最容易被忽略的是:改完 phpstorm.sh 不彻底退出 IDE,旧 Terminal 标签页仍沿用旧环境变量;或者 Run Configuration 加了参数却忘了点 OK 保存。每一步都要单独验证,而不是“感觉差不多了”就跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










