PHP文件中文显示问号的根本原因是源文件编码(如GBK)与编辑器/终端/浏览器默认的UTF-8不一致;需统一保存为UTF-8无BOM,并确保HTTP响应头、HTML声明及PHP字符串编码一致。
PHP 文件本身是纯文本,打开显示中文为问号,根本原因不是 PHP 语法问题,而是文件编码与编辑器/终端/浏览器三者之间不一致。直接改 php.ini 或加 header() 无法解决“用记事本/VS Code 打开 PHP 源文件就显示 ”这类问题。
很多编辑器(尤其是 Windows 自带记事本)默认用 GBK 或 ANSI 保存,但 PHP 解析器和现代 Web 环境默认按 UTF-8 处理。一旦源码里写了中文注释、字符串,而文件物理上存的是 GBK,就会在 UTF-8 环境下显示为问号或乱码。
UTF-8 才安全;若显示 GBK、ISO-8859-1 或 Auto,点击它 → 选择 Save with Encoding → UTF-8
File → Save with Encoding → UTF-8
编码 → 转为 UTF-8 无 BOM 格式 → 另存为(BOM 是坑,PHP 文件绝不要带 BOM)file -i your_file.php 查看真实编码;用 iconv -f GBK -t UTF-8 input.php > output.php 转换这是运行时输出层的问题,和源文件编码无关,但常被混为一谈。核心是 HTTP 响应头 + HTML 声明 + PHP 字符串三者没对齐。
echo 之前输出任何内容,否则 header() 会失败 后第一行加:header('Content-Type: text/html; charset=utf-8');
(放在 内,且越靠前越好)mysqli_set_charset($conn, 'utf8mb4') 或在 PDO DSN 加 ;charset=utf8mb4,注意是 utf8mb4 不是 utf8
php test.php)终端环境不认 UTF-8,或 PHP CLI 默认用 locale 编码解析输出。
locale,若 LANG 不含 UTF-8,临时修复:export LANG=en_US.UTF-8
GBK,运行前先执行 chcp 65001(切换到 UTF-8),再跑 php test.php
$OutputEncoding = [System.Text.Encoding]::UTF8
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。