HTML乱码根本原因是编码链断裂:文件实际编码、HTTP响应头charset、meta charset三者不一致;必须同时检查并统一为UTF-8(无BOM),且meta标签须位于head最前1024字节内。
HTML 编码本身不“依赖”乱码问题,但乱码问题几乎总是由 HTML 编码配置与实际文件编码不一致直接引发。 换句话说:不是 HTML 编码“导致”乱码,而是它没对上——就一定会乱。
<meta charset="UTF-8"> 写了还乱码常见错误现象:HTML 文件里明明写了 <meta charset="UTF-8">,浏览器却显示 “ä½ å¥½” 或方块、问号。
GBK(或 ANSI / Windows-1252),而 <meta> 声称是 UTF-8 → 浏览器按 UTF-8 解二进制流,自然错位<meta charset> 没放在 <head> 开头 1024 字节内(比如被注释、空行、BOM 或 JS 代码挡在前面)→ 浏览器跳过, fallback 到系统默认编码(如 Windows 上的 GBK)UTF-8 with BOM,BOM(EF BB BF)卡在 <!DOCTYPE> 前 → 部分浏览器/服务端解析异常,<meta> 失效Content-Type: text/html; charset=GBK → 此时 <meta> 被完全忽略(HTTP 头优先级高于 meta)不用猜,直接查三处:
Network 标签页里,点开 HTML 请求 → 看 Response Headers 中 Content-Type 是否含 charset=utf-8(有则以它为准;无则继续往下)查看页面源代码 → 确认 <meta charset="UTF-8"> 是否位于 <head> 最开头(且前面无空格、换行、BOM)file -i yourfile.html(Linux/macOS)或 hexdump -C yourfile.html | head -n 1 查是否以 ef bb bf 开头(即带 BOM)UTF-8 和 UTF-8 without BOM 怎么选绝大多数现代场景必须用 UTF-8 without BOM:
立即学习“前端免费学习笔记(深入)”;
UTF-8 with BOM 在 PHP、Node.js、JSON、某些构建工具中会把 BOM 当作非法字符 → 报 Unexpected token 或 Cannot modify header information
innerHTML、document.write)时,BOM 可能被当作文本节点渲染成空白或 DOM 异常UTF-8 without BOM;Notepad++ 需手动选 UTF-8(不含 BOM);Sublime Text 同理真正容易被忽略的点是:HTML 编码问题从来不是单点问题。它横跨编辑器保存设置、HTTP 响应头、<meta> 位置、外部资源(JS/CSS)编码、甚至数据库连接层的 SET NAMES。只要其中一环脱节,乱码就立刻出现,且往往只在特定环境(比如本地 file:// 打开 vs Nginx 部署后)才暴露。