HTML5乱码主因是文件编码与声明/响应头不一致:需确保文件为UTF-8无BOM、meta声明准确置于head首行、服务器响应头未覆盖charset。BOM和响应头冲突占90%案例。
最常见的情况是:编辑器用 UTF-8 无 BOM 保存了 index.html,但服务器或浏览器没按 UTF-8 解析。HTML5 默认要求 UTF-8,但不会自动强制生效——它依赖你显式声明和文件实际编码一致。
epad++ 查看右下角状态栏,确认显示的是 UTF-8(不是 UTF-8 with BOM 或 GBK) 声明在 最前面,且拼写准确:charset=UTF8、charset=utf8(少横线)或 content="text/html; charset=utf-8"(这是旧式 HTTP-equiv 写法,已过时)即使 写对了,如果服务器返回的 HTTP 响应头里有 Content-Type: text/html; charset=gbk,浏览器会优先信任响应头,直接忽略 HTML 内声明。
Response Headers 中的 content-type
file:// 协议,浏览器不发请求头,此时完全依赖 ,务必保证文件编码和声明一致.htaccess 加:AddDefaultCharset utf-8;Nginx 用户在 server 块中加:
charset utf-8;
某些编辑器(如老版 Windows 记事本)、前端构建工具(如 gulp-htmlmin 默认可能移除 )、甚至 Git 在换行符转换时,都可能悄悄插入 BOM 或改变编码。
xxd index.html | head,如果开头出现
00000000: efbb bf...,说明有 UTF-8 BOM,需另存为「UTF-8 无 BOM」html-webpack-plugin 一般安全,但自定义 minify 配置时禁用 removeAttributeQuotes 等可能干扰 meta 的选项"files.encoding": "utf8" 且 "files.autoGuessEncoding": false(避免猜错)这不属于 HTML 渲染乱码,但常被误认为“页面乱码”:当链接含中文路径(如 ),而服务器未配置 URL 解码支持,点击后可能 404 或返回错误内容。
URI decoding;例如 Node.js 的 express 默认支持,但 Nginx 需开启:underscores_in_headers on;并确保
location 块未错误重写 URI%E4%BD%A0%E5%A5%BD.html 是正常编码,不是乱码——只要服务端能正确 decode 就行UTF-8 无 BOM、 在 第一行、响应头里没有冲突的 charset。BOM 和服务器头这两处最容易被忽略。