“utf-8-sig”适合解码UTF-8和UTF-8 BOM吗?

4

我正在使用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版本。谢谢你的回答!
1个回答

5

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

编解码文档中:

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

在Windows环境下,utf-8-sig编码是最常见的。如果你要与Mac或*nix系统的用户共享文件,则他们期望接收标准的utf-8编码。


1
那么让我们看看我是否可以总结您的建议:使用 'utf-8-sig' 读取所有 UTF-8 文件,使用 'utf-8' 写入大多数文件,并使用 'utf-8-sig' 写入您知道将在 Windows 系统上独占打开的文件? - Mark Ransom
@MarkRansom 这更像是一种观察而不是建议,但是我认为这是一个合理的方法。如果必须选择,我倾向于在所有地方使用纯UTF-8编码,但说实话,我不知道是否有可能防止Windows应用程序在默认编码为UTF-8时仍然使用utf-8-sig编码。 - snakecharmerb
我可能错了,但我认为当你要求Excel将.csv以UTF-8保存时,它会在文件上放置签名,而且没有办法避免。这使得实现一个没有签名的世界变得困难。 - Mark Ransom
@MarkRansom,此外,Excel在没有BOM的情况下无法读取UTF-8文件。它会假定本地化的ANSI编码(例如,在美国Windows上是Windows-1252)。许多Windows程序都以这种方式处理UTF-8。 - Mark Tolonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接