BOM字符在Python 3中复制到JSON中

时间:2017-07-14 09:12:30

标签: python python-3.x file utf-8 byte-order-mark

在我的应用程序中,用户可以上传文件(文本文件),我需要读取它并为另一个API调用构造json对象。

我用

打开文件
f = open(file, encoding="utf-8")

得到第一个单词并构造Json对象,......

我的问题是一些文件(特别是来自Microsoft环境)在开头有BOM对象。问题是我的Json现在里面有这个角色

{
   "word":"\\ufeffMyWord"
}

当然,API从现在开始不起作用。

我显然想念一些东西,因为,不应该utf-8删除BOM对象吗? (因为它不是utf-8-sig)。

如何克服这个问题?

2 个答案:

答案 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"