在我的应用程序中,用户可以上传文件(文本文件),我需要读取它并为另一个 API 调用构造 json 对象。
我用
打开文件f = open(file, encoding="utf-8")
获取第一个单词并构造Json对象,...
我的问题是某些文件(尤其是来自 Microsoft 环境的文件)开头有 BOM 对象。问题是我的 Json 现在里面有这个字符
{
"word":"\\ufeffMyWord"
}
当然,从此时起,API 将无法正常工作。
我显然漏掉了什么,因为 utf-8 不应该删除 BOM 对象吗? (因为它不是 utf-8-sig)。
如何克服这个问题?
最佳答案
不,UTF-8 标准没有定义 BOM 字符。这是因为 UTF-8 没有像 UTF-16 和 UTF-32 那样的字节顺序歧义问题。 Unicode 联盟不建议在 UTF-8 编码文件的开头使用 U+FEFF,而如果存在指定编解码器的替代方案,IETF 会积极反对。来自Wikipedia article on BOM usage in UTF-8 :
The Unicode Standard permits the BOM in UTF-8, but does not require or recommend its use.
[...]
The IETF recommends that if a protocol either (a) always uses UTF-8, or (b) has some other way to indicate what encoding is being used, then it "SHOULD forbid use of U+FEFF as a signature."
Unicode 标准只“允许”BOM,因为它是一个常规字符,就像其他字符一样;它是一个零宽度的不间断空格字符。因此,Unicode 联盟建议在解码时不要删除,以保留信息(以防它有不同的含义,或者你想保持与已经依赖它的工具的兼容性)。
你有两个选择:
首先去除字符串,U+FEFF 被认为是空格,因此使用
str.strip()
去除。或者明确地删除 BOM:text = text.lstrip('\ufeff') # remove the BOM if present
(从技术上讲,这将删除任意数量的零宽度不间断空格字符,但这可能正是您想要的)。
改为使用
utf-8-sig
编解码器打开文件。添加该编解码器是为了处理此类文件,在解码之前从开头明确删除 UTF-8 BOM 字节序列(如果存在)。它可以处理没有这些字节的文件。
关于python - BOM 字符在 Python 3 中复制到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099079/