生成HTML文件时必须显式指定encoding='utf-8',并添加<meta charset="utf-8">标签,内容需转义,推荐用pathlib.Path.write_text(),且需验证无BOM。

生成 HTML 文件时,encoding='utf-8' 不是可选项,而是必须项;漏掉或依赖系统默认编码,大概率在 Windows 上直接报 UnicodeEncodeError 或生成乱码 HTML。
open() 写 HTML 时必须显式传 encoding 参数
Python 的 open() 在写入非 ASCII 字符(比如中文、emoji、特殊符号)时,若不指定 encoding,会 fallback 到系统默认编码:Windows 是 cp936(GBK),Linux/macOS 是 utf-8。跨平台脚本一旦省略,就等于埋雷。
- 正确写法:
with open('index.html', 'w', encoding='utf-8') as f: - 错误写法:
with open('index.html', 'w') as f:(没指定 encoding,Windows 下写中文必炸) - 即使内容全是英文,也建议写上——因为 HTML 文件头的
<meta charset="utf-8">和实际文件编码必须一致,否则浏览器可能误判
HTML 文件头的 meta charset 必须与实际编码匹配
只设 encoding='utf-8' 还不够。如果生成的 HTML 文件里没写 <meta charset="utf-8">,某些浏览器(尤其是旧版 IE 或未声明 charset 的环境)会按 ISO-8859-1 解析,导致页面显示为方块或问号。
-
<meta charset="utf-8">要放在<head>最靠前的位置(最好第一行) - 不要写成
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">—— 这是过时写法,现代 HTML5 只认charset属性 - 用 f-string 拼接时注意:确保整个 HTML 字符串是 Unicode,且写入时仍用
encoding='utf-8'
处理用户输入或外部文本时先 escape 再写入
如果 HTML 内容来自变量(比如从文件读取、API 返回、用户表单),不转义就直接拼进 HTML,轻则格式错乱,重则触发 XSS。
立即学习“前端免费学习笔记(深入)”;
- 用
html.escape()处理动态内容:html.escape(user_input) - 别手动替换
<、>等——容易漏掉"或&,而且不处理 Unicode 实体 - 如果内容本身含合法 HTML(如富文本编辑器输出),需用更严格的清洗方案(如
bleach),不能只靠escape
用 pathlib.Path.write_text() 更简洁安全
相比 open() + f.write(),pathlib.Path.write_text() 默认以 UTF-8 编码写入,且自动处理换行和关闭,代码更短、出错概率更低。
- 等价写法:
Path('index.html').write_text(html_content, encoding='utf-8') - 它内部就是调用
open(..., encoding='utf-8'),但封装掉了文件句柄管理 - 注意:如果
html_content是 bytes,必须用Path.write_bytes(),不能混用
最易被忽略的一点:HTML 文件生成后,务必用二进制方式验证实际字节是否为 UTF-8 —— 有些编辑器保存时会偷偷加 BOM,而 <meta charset="utf-8"> 并不兼容 UTF-8-BOM,会导致 Chrome 显示异常空白。用 xxd index.html | head 或 VS Code 底部编码提示确认无 BOM。



















