答案是修复关键在于传输链路全程 UTF-8 对齐:确保 PHP 文件为 UTF-8 无 BOM、HTML 声明 、MySQL 连接执行 mysqli_set_charset($conn, 'utf8'),且不改动 latin1_swedish_ci 表结构。

PHP 7.4 默认强制输出 UTF-8,但旧站若仍用 windows-1252 声明 + latin1_swedish_ci 数据库 + SET NAMES latin1,必然触发浏览器报错 “The byte stream was erroneous”,法语字符(é, à, ç)显示为问号或方块——这不是数据损坏,而是声明与字节流不匹配。修复关键不是改数据库,而是让传输链路全程对齐 UTF-8。
确保 PHP 文件本身是 UTF-8 无 BOM
哪怕其他设置全对,只要 PHP 脚本含 BOM(\xEF\xBB\xBF),就会在输出前“偷偷”吐出三个字节,导致 header() 失效、mysqli_set_charset() 报错或页面开头多空白行。
- 用 VS Code 打开文件,右下角看编码标识,若显示 “UTF-8 with BOM” 或 “GBK”,点击切换 → “Save with Encoding” → 选
UTF-8(明确不含 BOM) - Linux 下验证:
file -i your_script.php,输出应为charset=utf-8,不含with bom - 切勿依赖编辑器“另存为”时模糊的“UTF-8”选项——有些默认带 BOM,必须手动排除
统一 HTTP 响应头与 HTML meta 声明为 UTF-8
PHP 7.4 的 default_charset = UTF-8 会自动加 Content-Type: text/html; charset=UTF-8 响应头,此时若 HTML 还写 charset=windows-1252,浏览器直接拒绝解析。
- 删掉所有旧式声明:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> - 替æ



















