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

标签 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)。

如何克服这个问题?

最佳答案

不,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/

相关文章:

python - 什么是 setup.py?

python - 相同函数的 Or-ing 返回值

python - 从套接字接收数据时脚本挂起

Java:仅替换文件中的一行/字符串

python - 如何在漏勺中创建 "type-agnostic"SchemaNode

python - InternalError : current transaction is aborted, 命令被忽略,直到事务 block 结束

c - 为什么“while(!feof(file))”总是错误的?

python - 使用 Python 查找目录中的所有 CSV 文件

尽管 Linux 上有 __init.py__ 和正确的 PYTHONPATH,但仍出现 Python ModuleNotFoundError

python - Pandas read_xml 将 "N/A"读取为 NaN