<meta charset="UTF-8">必须位于<head>开头且HTML文件须为UTF-8无BOM编码,否则浏览器无视;常见乱码因文件实际编码非UTF-8、meta位置错误、HTTP响应头覆盖(如charset=GBK)、或非法写法(如utf8/UTF_8)所致。

meta charset="UTF-8" 必须写在 <head> 开头,且 HTML 文件本身必须存为 UTF-8(无 BOM),否则浏览器会无视它——这是绝大多数乱码问题的根源。
为什么 meta charset 写了还是乱码
常见现象:页面明明写了 <meta charset="UTF-8">,但中文仍显示为方块或问号。
- 文件实际保存格式不是 UTF-8:比如用 Windows 记事本另存为“ANSI”或“UTF-16”,
meta标签就完全失效 -
meta位置错误:写在<title>或<script>后面,某些浏览器(尤其旧版 IE)可能跳过解析 - HTTP 响应头覆盖了
meta:服务器返回Content-Type: text/html; charset=GBK,浏览器以响应头为准 - 用了非法写法:
charset="utf8"、charset="UTF_8"、charset=utf-8(没加引号)都不被 HTML5 规范认可
VS Code / Notepad++ / Sublime Text 怎么确保存为 UTF-8(无 BOM)
编辑器保存编码不一致,是本地开发时最隐蔽的坑。
- VS Code:右下角点击当前编码(如 “GBK”),选 “Save with Encoding” → “UTF-8”;不要选 “UTF-8 with BOM”(BOM 会干扰 PHP、Node.js 等服务端读取)
- Notepad++:菜单栏 “编码” → “转为 UTF-8 编码”(不是 “UTF-8-BOM”)→ 再 “保存”
- Sublime Text:“File” → “Save with Encoding” → “UTF-8”
- 验证方式:用十六进制编辑器(如 HxD)打开文件,开头三字节不是
EF BB BF,才是真正的无 BOM UTF-8
Apache / Nginx 如何强制 HTTP 响应头为 UTF-8
当 HTML 通过 Web 服务器访问(比如 http://localhost/),响应头比 meta 优先级更高。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
立即学习“前端免费学习笔记(深入)”;
- Apache:在站点根目录或
.htaccess中添加AddDefaultCharset UTF-8;若已存在同名指令,需删除或注释掉旧行(如AddDefaultCharset GBK) - Nginx:在
server或location块中添加charset utf-8;(注意是小写utf-8,Nginx 不认大写的UTF-8) - 验证方法:Chrome 打开 DevTools → Network → 刷新页面 → 点 HTML 请求 → 查看 Response Headers 中的
content-type字段,必须是text/html; charset=utf-8
PHP / Python / Node.js 动态生成 HTML 时的陷阱
后端拼接 HTML 字符串时,源文件编码、输出编码、HTTP 头三者必须统一。
- PHP:如果 PHP 文件本身是 GBK 编码,却 echo 出
<meta charset="UTF-8">,浏览器收到的是 GBK 解码后的乱码字节,meta标签直接报废 - Python
http.server:默认不发Content-Type头,此时完全依赖meta;但若手动调用self.send_header('Content-Type', 'text/html; charset=gbk'),就覆盖了 HTML 内容 - Node.js:用
res.setHeader('Content-Type', 'text/html; charset=utf-8')显式设置,比靠meta更可靠 - 关键点:后端脚本文件自身也得是 UTF-8 编码,且不能含 BOM;否则第一行
<?php或#!/usr/bin/env node都可能解析失败
最容易被忽略的是:HTML 文件编码、meta 值、HTTP 响应头、后端脚本文件编码、甚至外部 JS/CSS 文件编码,这五者只要有一个是 GBK 或 ANSI,整个链路就可能断裂。调试时别只盯着 meta 标签——先确认文件二进制开头是不是 EF BB BF,再查 Network 面板里的响应头,最后看后端代码文件属性。


















