必须在HTML的<head>中第一行写<meta charset="UTF-8">,且文件保存编码必须与之严格一致,否则会导致中文乱码;该标签需自闭合、带引号、用标准名称,不可依赖HTTP头覆盖。

HTML 中必须用 <meta charset> 声明字符集
浏览器默认不按 UTF-8 解析 HTML,不显式声明会导致中文乱码、特殊符号显示为方块或问号。唯一可靠方式是在 <head> 中第一行(越靠前越好)写:
<meta charset="UTF-8">。这个标签必须是自闭合的,不能写成
<meta charset="UTF-8"></meta>,也不能漏掉引号。如果页面里有非 ASCII 字符(比如中文标题、emoji),而没加这行,几乎必然出问题。
不要依赖 HTTP Header 覆盖 <meta charset>
虽然服务器可通过 Content-Type: text/html; charset=UTF-8 响应头指定编码,但 HTML 规范明确要求:当 <meta charset> 存在时,浏览器以它为准,忽略响应头。反过来,如果响应头设了 GBK 但 HTML 里写了 UTF-8,浏览器仍会按 UTF-8 解析——这意味着如果文件实际保存为 GBK 编码,就会彻底乱码。所以文件保存编码必须和 <meta charset> 值严格一致。
常见错误:BOM、编辑器保存设置、VS Code 默认行为
即使写了 <meta charset="UTF-8">,仍可能乱码,原因常不在 HTML 本身:
- 文件带 BOM(Byte Order Mark):UTF-8-BOM 在某些旧环境(如 IE)下会被当成普通字符,导致
<meta>不在最开头,失效;用编辑器「另存为 UTF-8 无 BOM」解决 - 编辑器保存编码不匹配:Sublime Text / VS Code 默认可能用 UTF-8,但若手动改过设置,或从别人那里复制代码,容易误存为 GBK/ISO-8859-1
- VS Code 的坑:新建文件默认 UTF-8,但打开一个已有 GBK 文件后,它会记住该编码,下次新建也沿用——务必看右下角状态栏的编码标识,点击切换并「通过编码保存」
charset 值只能写标准名称,不能写别名
必须用规范字符串,例如:"UTF-8"(注意短横线和大小写),不能写 "utf8"、"utf_8" 或 "unicode"。浏览器对非标准写法兼容性差,部分版本直接忽略。另外,ISO-8859-1 和 Windows-1252 虽然历史常用,但不支持中文,除非维护老系统,否则不要用。现在所有现代场景都应统一用 UTF-8。
立即学习“前端免费学习笔记(深入)”;
实际部署时,最容易被忽略的是文件保存编码与<meta charset> 的同步——改了 HTML 标签却忘了重新保存文件,或者用了构建工具(如 Webpack)自动注入 meta,但源文件仍是 GBK 编码,这种错配不会报错,只会静默乱码。


















