HTML 中文不乱码的关键是 HTTP 响应头 Content-Type 必须声明 charset=UTF-8,且需在获取输出流前设置;仅靠 无效,各语言框架和中间件均需统一编码配置。

Java Servlet 输出 HTML 时 charset 必须在 setContentType 中声明
只拼接 <meta charset="UTF-8"> 没用——浏览器优先信任 HTTP 响应头里的 Content-Type,后端不设,前端 meta 就是摆设。
常见错误现象:response.getWriter().write("<meta charset='\"UTF-8\"'>...") 写了但中文仍乱码;或本地测试正常,部署到 Tomcat/Nginx 后变问号。
-
setContentType("text/html; charset=UTF-8")必须在getWriter()或getOutputStream()调用前执行 - 不能写成
setContentType("text/html")然后靠 meta 补救;也不能漏掉分号和空格 - 若用
PrintWriter,还建议紧接着调用response.setCharacterEncoding("UTF-8")(部分旧容器要求)
Spring Boot 的 @ResponseBody 和模板引擎默认编码陷阱
Spring Boot 2.3+ 默认使用 text/html;charset=UTF-8,但前提是没被中间件覆盖。实际出问题多发生在模板渲染或手动拼串场景。
使用 Thymeleaf / Freemarker 时:<meta charset="UTF-8"> 有效,但前提是模板文件本身保存为 UTF-8(无 BOM),且未被 IDE 错误转码。
立即学习“前端免费学习笔记(深入)”;
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 手动返回字符串(如
@ResponseBody String):Spring 默认走 Jackson,对 HTML 字符串不自动加 charset,需显式配置StringHttpMessageConverter - 用
ModelAndView返回视图:确保application.properties中有spring.http.encoding.charset=UTF-8和spring.http.encoding.enabled=true - 若 Nginx 反向代理,它可能重写
Content-Type头(尤其启用了charset utf-8指令但未限定 MIME 类型),此时后端设置会被覆盖
Node.js Express 动态拼接 HTML 的三处关键点
用 res.send(htmlString) 拼 HTML?默认发的是 text/html; charset=utf-8,看似安全,但仍有坑。
常见错误现象:JS 里含中文字符串、emoji 或用户输入内容,页面显示 或截断;或控制台报 Uncaught SyntaxError: Invalid or unexpected token。
- 必须确保 Node.js 源文件(.js)本身是 UTF-8 编码(VS Code 右下角确认),否则
const html = "<div>你好</div>"在读取时就已损坏 - 若 HTML 字符串来自数据库或外部 API,需确认其原始编码并显式转码(如用
iconv-lite处理 GBK 回源) - 避免在拼接中混入非 UTF-8 字节流,例如直接
fs.readFileSync("legacy.html")而不指定 encoding,会默认按系统 locale 解码(Windows 是 GBK)
PHP 输出 HTML 时 header() 和 mb_internal_encoding() 要配对
PHP 默认输出编码不是 UTF-8,即使 HTML 里写了 <meta charset="UTF-8">,echo "中文" 也可能被当 GBK 发出去。
典型错误:用 mysqli 查数据库返回中文,但没设连接编码,结果查出来就是乱码字节,再怎么 header 也救不回。
- 必须在输出任何内容前调用
header('Content-Type: text/html; charset=UTF-8') - 同时执行
mb_internal_encoding('UTF-8'),否则mb_strlen()等函数行为异常,间接影响 HTML 拼接逻辑 - MySQL 连接需显式设编码:
$mysqli->set_charset('utf8mb4')(注意是 utf8mb4,不是 utf8) - 若用
file_get_contents()读取本地 HTML 模板,务必加第二个参数FILE_TEXT并确保文件是 UTF-8(无 BOM)
最易被忽略的点:所有环节——源码文件、数据库连接、HTTP 响应头、HTML meta、甚至反向代理配置——只要有一处是 GBK 或未声明 charset,整个链路就可能断裂。别只盯着一个地方改。


















