gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:49 29 4
gpt4 key购买 nike

在我的应用程序中,用户可以上传文件(文本文件),我需要读取它并为另一个 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com