用notepad++保存xml时应选「编码→utf-8 无 bom」再另存,因默认utf-8含bom(\xef\xbb\xbf),会导致xml解析器报错;需用十六进制工具或python验证开头三字节是否为ef bb bf。

Notepad++ 保存 XML 文件时怎么去掉 BOM
直接选「编码 → UTF-8 无 BOM」再保存,就能彻底避免 BOM。Notepad++ 默认的「UTF-8」其实是带 BOM 的,这点非常隐蔽,XML 解析器(比如 Python 的 xml.etree.ElementTree 或 Java 的 SAXParser)一读到开头的 \xEF\xBB\xBF 就会报 UnicodeDecodeError 或 Invalid byte order mark。
- 操作路径:菜单栏
编码 → UTF-8 无 BOM→ 再点文件 → 另存为(仅“保存”不会改编码) - 如果文件已存在且当前是带 BOM 的 UTF-8,先切换编码再另存,否则只是覆盖原文件但 BOM 还在
- 别信右下角状态栏写的“UTF-8”——它不区分有无 BOM,必须看菜单里是否勾选了「UTF-8 无 BOM」
怎么确认 XML 文件真没 BOM
不能只靠 Notepad++ 状态栏或文件名判断,BOM 是看不见的字节。最稳的方式是用命令行或十六进制查看器验证开头三字节。
- Windows 命令行:
certutil -hashfile your.xml MD5没用;改用xxd -l 4 your.xml(WSL)或Format-Hex your.xml -Count 4(PowerShell),看前三个字节是不是ef bb bf - Notepad++ 自带十六进制查看:菜单
视图 → 显示符号 → 显示字节,光标放第一列,看前三个值 - Python 快速验证:
open('test.xml', 'rb').read(3) == b'\xef\xbb\xbf'返回True就说明还有 BOM
为什么 XML + BOM 容易出错
XML 规范明确要求文档必须以 <?xml 开头,BOM 插在最前面就破坏了这个前提。很多解析器不是“忽略”,而是直接拒绝。
-
lxml会抛XMLSyntaxError: Document is empty(实际不空,是 BOM 卡住了) - Java
DocumentBuilder.parse()报org.xml.sax.SAXParseException: Content is not allowed in prolog - 浏览器加载本地 XML 时,控制台可能静默失败,Network 面板显示 status 0,根本不会提示 BOM 问题
- 即使解析成功,某些工具(如 XSLT 处理器)可能把 BOM 当作文本节点,导致 XPath
/root匹配失败
批量处理已有 XML 文件的 BOM
手动一个个开 Notepad++ 不现实。用脚本更可靠,关键是「只删开头的 BOM,不碰其他内容」。
- Python 批量去 BOM(保留原编码):
import pathlib<br>for p in pathlib.Path(".").glob("*.xml"): <br> content = p.read_bytes()<br> if content.startswith(b"\xef\xbb\xbf"):<br> p.write_bytes(content[3:]) - Linux/macOS 一行命令:
sed -i '1s/^\xEF\xBB\xBF//' *.xml(注意 GNU sed 才支持\xEF这种写法) - 别用
iconv -f UTF-8 -t UTF-8//IGNORE,它可能误删合法字符,而且不保证只动开头










