PHP输出中文需先设置Content-Type响应头为UTF-8,且header()必须在任何输出前调用;文件须为UTF-8无BOM格式,跨域时还需正确配置CORS头。
PHP输出中文前必须设置Content-Type响应头
浏览器默认用ISO-8859-1解析响应,PHP脚本不显式声明编码时,即使源文件是UTF-8,中文也会显示为乱码。关键不是“加编码”,而是让HTTP响应头和实际内容编码一致。
-
header('Content-Type: text/html; charset=utf-8')必须在任何输出(包括空格、BOM)之前调用 - 如果用了
echo或print输出了空格或换行再调用header(),会触发Warning: Cannot modify header information - 使用
mb_http_output('UTF-8')可辅助确保多字节输出编码正确,但不能替代header()
PHP文件本身必须保存为UTF-8无BOM格式
编辑器悄悄加的BOM(0xEF 0xBB 0xBF)会被当作实际输出,导致header()失效——这是跨域请求中乱码最隐蔽的来源之一。
- 用VS Code、Sublime Text等工具打开PHP文件,右下角确认编码显示为
UTF-8,不是UTF-8 with BOM - Linux/macOS下可用
file -i your.php检查;Windows下可用Notepad++ → 编码 → 转为UTF-8(无BOM) - 一旦BOM存在,
json_encode()返回的JSON前面会多出不可见字符,前端JSON.parse()直接报错
跨域AJAX请求中PHP需同时处理CORS头与编码
只设charset=utf-8不够,浏览器对跨域响应更严格:Content-Type声明、实际字节流、CORS头三者必须自洽。