IIS 10 + PHP 7.4.33 中文文件名读取失败的根源是 Windows OEM 代码页(GBK)与 PHP UTF-8 字符串处理不一致;需设置 sapi_windows_cp_set=936、cgi.fix_pathinfo=0,并用 sapi_windows_cp_conv() 显式转码路径。

Windows IIS 10 下 PHP 7.4.33 无法读取中文文件名,核心问题不是 PHP 或 IIS 单独出错,而是 Windows 文件系统、PHP 运行时和 IIS 处理路径时的编码协同失效。默认情况下,PHP 的 CGI/FastCGI 模式在 Windows 上使用系统 OEM 代码页(如 GBK)解析路径,但若脚本或环境未显式声明,就容易在打开、重命名、遍历含中文名的文件或目录时返回 false、警告或乱码路径。
确认并统一系统与 PHP 的代码页
Windows 控制台和文件 I/O 默认依赖 OEM 代码页(例如简体中文系统为 936 / GBK),而 PHP CLI 或 Web SAPI 可能按 UTF-8 解析字符串,造成路径不匹配。需主动对齐:
- 运行 chcp 命令,确认当前控制台代码页是 936(非 65001);如果不是,临时执行 chcp 936
- 在 php.ini 中添加或修改以下配置:
default_charset = "UTF-8" internal_encoding = "UTF-8" output_encoding = "UTF-8" sapi_windows_cp_set = 936
注意:sapi_windows_cp_set 是 PHP 7.4+ Windows 特有指令,可强制将运行时代码页设为 GBK,确保fopen()、file_get_contents()等函数正确识别中文路径 - 避免使用
ini_set('default_charset', ...)动态设置,它在 FastCGI 生命周期中可能无效
禁用可能导致路径解析异常的 php.ini 选项
某些旧式兼容性设置会干扰中文路径处理,尤其在 FastCGI 模式下:
- 确认 cgi.fix_pathinfo = 0(必须为 0,否则 PHP 可能错误拆分含中文的 PATH_INFO)
- 注释或删除 cgi.force_redirect = 1(IIS 不需要该保护,启用反而引发路径截断)
- 检查 mbstring.script_encoding 是否被设为非 UTF-8 值,若有则清空或设为 UTF-8
PHP 脚本中安全操作中文路径的写法
即使环境配置正确,直接传入中文路径字符串仍可能因内部编码转换失败。推荐做法:
立即学习“PHP免费学习笔记(深入)”;
- 用 sapi_windows_cp_conv() 显式转码路径:
$utf8_path = 'D:\站点\测试文件.txt';<br>$gbk_path = sapi_windows_cp_conv($utf8_path, 936, 'UTF-8');<br>$content = file_get_contents($gbk_path);
- 对
scandir()、glob()返回的中文文件名,用 mb_convert_encoding($name, 'UTF-8', 'GBK') 转回 UTF-8 再处理 - 上传表单接收中文文件名时,确保前端
<form accept-charset="UTF-8">,且 PHP 中用mb_convert_encoding($_FILES['file']['name'], 'GBK', 'UTF-8')转换后再保存
验证与排查要点
快速定位是否为编码问题:
- 新建测试脚本
test_chinese.php,内容为:<?php var_dump(getcwd()); // 查看当前工作目录编码表现 var_dump(scandir('.')); // 观察中文文件名是否显示为 或乱码 var_dump(sapi_windows_cp_get()); // 应输出 int(936) ?> - 检查 IIS 日志或 PHP 错误日志中是否有 "No such file or directory" 但路径明显存在的报错——这基本可判定是路径编码不一致
- 确认网站物理路径本身不含 Unicode 超长路径(如超过 260 字符),必要时启用 Windows 长路径支持(组策略:计算机配置 → 管理模板 → 系统 → 文件系统 → 启用 Win32 长路径)



















