📦 什么是 BOM 头?
BOM(Byte Order Mark,字节顺序标记)是一个特殊的Unicode字符,通常出现在文本文件的开头,用于标识文件的编码类型和字节序。不同的编码有不同的BOM字节序列。
常见的 BOM 类型
| 编码 | BOM 字节值 | 说明 |
|---|---|---|
| UTF-8 | EF BB BF | 最常用的BOM,Windows记事本保存UTF-8时会添加 |
| UTF-16 LE | FF FE | 小端序UTF-16 |
| UTF-16 BE | FE FF | 大端序UTF-16 |
| UTF-32 LE | FF FE 00 00 | 小端序UTF-32 |
| UTF-32 BE | 00 00 FE FF | 大端序UTF-32 |
为什么需要处理 BOM 头?
- 跨平台问题:Windows 记事本保存的 UTF-8 文件默认带 BOM,而 Linux/Unix 系统通常不带 BOM,可能导致脚本执行异常。
- 编程问题:PHP、Python 等语言在输出内容前如果有 BOM,可能导致 HTTP 头无法发送或页面显示异常。
- 数据导入问题:CSV 文件带 BOM 时,部分程序可能将 BOM 当作数据内容处理。
🐍 Python 中检测和去除 BOM
# 检测文件是否有 UTF-8 BOM
with open('file.txt', 'rb') as f:
content = f.read()
if content.startswith(b'\xef\xbb\xbf'):
print("文件包含 UTF-8 BOM")
else:
print("文件无 BOM")
# 去除 BOM
with open('file.txt', 'rb') as f:
content = f.read()
if content.startswith(b'\xef\xbb\xbf'):
content = content[3:]
with open('file_nobom.txt', 'wb') as f:
f.write(content)
# 添加 UTF-8 BOM
with open('file.txt', 'rb') as f:
content = f.read()
with open('file_with_bom.txt', 'wb') as f:
f.write(b'\xef\xbb\xbf' + content)