簡體   English   中英

附加到結尾時文件中間的python utf-8-sig BOM

[英]python utf-8-sig BOM in the middle of the file when appending to the end

我最近注意到Python在使用utf-8-sig編碼附加到文件時表現得非常明顯。 見下文:

>>> import codecs, os
>>> os.path.isfile('123')
False
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')

以下文本以文件結尾:

<BOM>123
<BOM>123

這不是一個bug嗎? 這是不合邏輯的。 任何人都可以向我解釋為什么會這樣做? 為什么不在文件不存在且需要創建時才設置BOM?

不,這不是一個bug; 這是完全正常的,預期的行為。 編解碼器無法檢測已經寫入文件的數量; 例如,您可以使用它附加到預先創建但空的文件。 該文件不是新文件,但也不包含BOM。

然后還有其他用例,其中編解碼器用於流或字節codecs.open() (例如,不使用codecs.open() ),其中根本沒有文件要測試,或者開發人員想要在開始時強制執行BOM輸出,總是。

僅在文件上使用utf-8-sig ; 編解碼器將始終在您使用時寫出BOM。

如果您直接使用文件,您可以自己測試一下; 使用utf-8代替並手動編寫BOM,這只是一個編碼的U + FEFF ZERO WIDTH NO-BREAK SPACE

import io

with io.open(filename, 'a', encoding='utf8') as outfh:
    if outfh.tell() == 0:
        # start of file
        outfh.write(u'\ufeff')

我使用了較新的io.open()而不是codecs.open() ; io是為Python 3開發的新I / O框架,根據我的經驗,它比處理編碼文件的codecs更強大。

請注意,UTF-8 BOM實際上是無用的。 UTF-8 沒有可變字節順序 ,因此只有一個字節順序標記。 另一方面,UTF-16或UTF-32可以用兩個不同的字節順序之一寫入,這就是需要BOM的原因。

Microsoft產品主要使用UTF-8 BOM來自動檢測文件的編碼(例如, 不是遺留代碼頁之一)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM