检测 Python 中的字节顺序标记 (BOM)
Detect Byte Order Mark (BOM) in Python
我找到了很多描述如何 parse/ignore BOM 的帖子,但找不到任何关于如何简单地输出 true/false 文件是否包含 BOM 的信息。任何人都可以在 Python 中为我指出正确的方向吗?
简单的答案是:读取前 4 个字节并查看它们。
with open("utf32le.file", "rb") as file:
beginning = file.read(4)
# The order of these if-statements is important
# otherwise UTF32 LE may be detected as UTF16 LE as well
if beginning == b'\x00\x00\xfe\xff':
print("UTF-32 BE")
elif beginning == b'\xff\xfe\x00\x00':
print("UTF-32 LE")
elif beginning[0:3] == b'\xef\xbb\xbf':
print("UTF-8")
elif beginning[0:2] == b'\xff\xfe':
print("UTF-16 LE")
elif beginning[0:2] == b'\xfe\xff':
print("UTF-16 BE")
else:
print("Unknown or no BOM")
不那么简单的答案是:
可能有些二进制文件看起来有 BOM,但它们可能仍然只是二进制文件,其中的数据意外地看起来像 BOM。
除此之外,您通常也可以将没有 BOM 的文本文件视为 UTF-8。
我找到了很多描述如何 parse/ignore BOM 的帖子,但找不到任何关于如何简单地输出 true/false 文件是否包含 BOM 的信息。任何人都可以在 Python 中为我指出正确的方向吗?
简单的答案是:读取前 4 个字节并查看它们。
with open("utf32le.file", "rb") as file:
beginning = file.read(4)
# The order of these if-statements is important
# otherwise UTF32 LE may be detected as UTF16 LE as well
if beginning == b'\x00\x00\xfe\xff':
print("UTF-32 BE")
elif beginning == b'\xff\xfe\x00\x00':
print("UTF-32 LE")
elif beginning[0:3] == b'\xef\xbb\xbf':
print("UTF-8")
elif beginning[0:2] == b'\xff\xfe':
print("UTF-16 LE")
elif beginning[0:2] == b'\xfe\xff':
print("UTF-16 BE")
else:
print("Unknown or no BOM")
不那么简单的答案是:
可能有些二进制文件看起来有 BOM,但它们可能仍然只是二进制文件,其中的数据意外地看起来像 BOM。
除此之外,您通常也可以将没有 BOM 的文本文件视为 UTF-8。