PHP文件中文显示问号的根本原因是源文件编码(如GBK)与编辑器/终端/浏览器默认的UTF-8不一致;需统一保存为UTF-8无BOM,并确保HTTP响应头、HTML声明及PHP字符串编码一致。

PHP 文件本身是纯文本,打开显示中文为问号,根本原因不是 PHP 语法问题,而是文件编码与编辑器/终端/浏览器三者之间不一致。直接改 php.ini 或加 header() 无法解决“用记事本/VS Code 打开 PHP 源文件就显示 ”这类问题。
确认 PHP 文件实际保存的编码格式
很多编辑器(尤其是 Windows 自带记事本)默认用 GBK 或 ANSI 保存,但 PHP 解析器和现代 Web 环境默认按 UTF-8 处理。一旦源码里写了中文注释、字符串,而文件物理上存的是 GBK,就会在 UTF-8 环境下显示为问号或乱码。
- 用 VS Code 打开 PHP 文件,右下角看状态栏:显示
UTF-8才安全;若显示GBK、ISO-8859-1或Auto,点击它 → 选择Save with Encoding→UTF-8 - Sublime Text:菜单
File → Save with Encoding → UTF-8 - Notepad++:菜单
编码 → 转为 UTF-8 无 BOM 格式 → 另存为(BOM 是坑,PHP 文件绝不要带 BOM) - Linux/macOS 下可用
file -i your_file.php查看真实编码;用iconv -f GBK -t UTF-8 input.php > output.php转换
浏览器中 PHP 输出中文显示为问号
这是运行时输出层的问题,和源文件编码无关,但常被混为一谈。核心是 HTTP 响应头 + HTML 声明 + PHP 字符串三者没对齐。
- 确保 PHP 脚本开头没有空格、BOM 或
echo之前输出任何内容,否则header()会失败 - 在
后第一行加:header('Content-Type: text/html; charset=utf-8'); - HTML 中必须有:
(放在内,且越靠前越好) - 如果连接 MySQL,执行
mysqli_set_charset($conn, 'utf8mb4')或在 PDO DSN 加;charset=utf8mb4,注意是utf8mb4不是utf8
命令行运行 PHP 显示中文为问号(如 php test.php)
终端环境不认 UTF-8,或 PHP CLI 默认用 locale 编码解析输出。
立即学习“PHP免费学习笔记(深入)”;
- Linux/macOS:检查当前 locale:
locale,若LANG不含UTF-8,临时修复:export LANG=en_US.UTF-8 - Windows CMD:默认是
GBK,运行前先执行chcp 65001(切换到 UTF-8),再跑php test.php - PowerShell:默认支持 UTF-8,但需确认
$OutputEncoding = [System.Text.Encoding]::UTF8 - PHP 脚本内可强制指定输出编码:
mb_internal_encoding('UTF-8');,但这只影响mb_*函数,不影响echo原始输出
最容易被忽略的是:PHP 文件带 BOM。哪怕只是多了一个看不见的 EF BB BF 字节,就可能导致 Cannot modify header information 错误,进而让 Content-Type 失效,最终浏览器用默认编码(通常是 ISO-8859-1)解析页面——所有中文全变问号。检查 BOM 最简单方法:用 hex editor 看文件头,或在 VS Code 中打开后看右下角是否标了 UTF-8 with BOM。











