在我的应用程序中,用户可以上传文件(文本文件),我需要读取它并为另一个API调用构造json对象。
我用
打开文件f = open(file, encoding="utf-8")
得到第一个单词并构造Json对象,......
我的问题是一些文件(特别是来自Microsoft环境)在开头有BOM对象。问题是我的Json现在里面有这个角色
{
"word":"\\ufeffMyWord"
}
当然,API从现在开始不起作用。
我显然想念一些东西,因为,不应该utf-8删除BOM对象吗? (因为它不是utf-8-sig)。
如何克服这个问题?
答案 0 :(得分:3)
不,UTF-8标准没有定义BOM字符。这是因为UTF-8没有像UTF-16和UTF-32那样的字节顺序模糊问题。 Unicode联盟并不建议在UTF-8编码文件的开头使用U + FEFF,而如果存在指定编解码器的替代方案,IETF会主动阻止它。来自Wikipedia article on BOM usage in UTF-8:
Unicode标准允许使用UTF-8的BOM,但不要求或建议使用它。
[...]
IETF建议,如果协议要么(a)总是使用UTF-8,要么(b)有其他方式来指示正在使用的编码,那么它应该禁止使用U + FEFF作为签名。"
仅限Unicode标准允许' BOM,因为它是一个常规字符,就像任何其他人一样;它是一个零宽度的不间断空格字符。因此,Unicode联盟建议在解码时不删除以保留信息(如果它具有不同的含义或者您希望保持与依赖它的工具的兼容性)。
您有两种选择:
首先剥离字符串,U + FEFF被视为空格,因此使用str.strip()
删除。或者明确地剥离BOM:
text = text.lstrip('\ufeff') # remove the BOM if present
(从技术上讲,'将删除任意数量的零宽度不间断空格字符,但这可能是您不想要的。)
使用utf-8-sig
编解码器打开文件。添加了该编解码器来处理此类文件,在解码之前显式删除UTF-8 BOM字节序列(如果存在)。它将处理没有这些字节的文件。
答案 1 :(得分:-1)
UTF-8不会删除BOM(字节顺序标记)。您必须检查文件是否包含BOM,将其删除。
if text.startswith(codecs.BOM_UTF8):
headers[0] = (headers[0])[3:]
print "Removed BOM"
else:
print "No BOM char, Process your file"