【问题标题】:Is "utf-8-sig" suitable for decoding both UTF-8 and UTF-8 BOM?“utf-8-sig”是否适合解码 UTF-8 和 UTF-8 BOM?
【发布时间】:2020-12-09 23:42:35
【问题描述】:

我正在使用 Python CSV 库来读取两个 CSV 文件。

一个用 UTF-8-BOM 编码,另一个用 UTF-8 编码。在我的实践中,我发现两个文件都可以通过使用“utf-8-sig”作为编码类型来读取:

from csv import reader 
with open(file_path, encoding='utf-8-sig') as csv_file:
    c_reader = reader(csv_file, delimiter=',')
    headers = next(c_reader)    
    for row in c_reader:
        print(row)

我想确认一下,“utf-8-sig”是否适合解码 UTF-8 和 UTF-8 BOM? 我正在使用 Python 3.6 和 3.7 版。感谢您的回答!

【问题讨论】:

    标签: python csv utf-8 character-encoding


    【解决方案1】:

    utf-8-sig 编解码器将解码 utf-8-sig 编码的文本和使用标准 utf-8 编码的文本

    >>> s = 'Straße'
    >>> utf8_sig = s.encode('utf-8-sig')
    >>> utf8 = s.encode('utf')
    >>> print(utf8_sig.decode('utf-8-sig'))
    Straße
    >>> print(utf8.decode('utf-8-sig'))
    Straße
    

    来自编解码器docs

    在将任何 Unicode 字符写入文件之前,将写入一个 UTF-8 编码的 BOM(看起来像这样的字节序列:0xef、0xbb、0xbf)...在解码 utf-8-sig 时如果这三个字节作为文件中的前三个字节出现,则跳过它们。

    在 Windows 环境中最常见的 utf-8-sig 编码。如果您在 mac 或 *nix 系统上与用户共享文件,标准的 utf-8 编码是他们希望收到的。

    【讨论】:

    • 所以让我们看看我是否可以总结您的建议:使用'utf-8-sig' 读取所有UTF-8 文件,使用'utf-8' 写入大多数文件,并使用'utf-8-sig' 写入您知道的文件会在 Windows 系统上独占打开吗?
    • @MarkRansom 这更像是一种观察而不是建议,但是是的,我认为这是一种合理的方法。如果我被逼迫,我会倾向于到处说纯 UTF-8,但我不知道是否有可能阻止 Windows 应用程序使用 utf-8-sig,即使 utf-8 是默认编码。跨度>
    • 我可能错了,但我认为当您要求 Excel 以 UTF-8 保存 .csv 时,它会将签名放在文件上,并且无法避免。这使得很难实现没有签名的世界。
    • @MarkRansom Excel 也不会读取没有 BOM 的 UTF-8 文件。它将采用本地化的 ANSI 编码(例如,美国 Windows 上的 Windows-1252)。许多 Windows 程序使用 UTF-8 以这种方式工作。
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 2018-09-11
    • 2016-05-04
    • 2021-08-01
    • 2014-03-10
    • 2018-10-28
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多