利用Python讀取文件時出現\ufeff的原因及解決辦法


今天利用Python讀取一個json文件

def read_file(file_path):
    file_content = ""
    if os.path.isfile(file_path):
        with open(file_path, "r", encoding='utf-8', errors='ignore') as file_obj:
            while 1:
                content_chunk = file_obj.read(1024)
                if not content_chunk:
                    break
                file_content += content_chunk
    return file_content

文件是可以讀取出來,出來的的json 文件是列表字符串.需要轉換成列表,我是用的是eval函數

 

 經過查看是讀取出來的文件前面增加了一個\ufeff

 

原因分析

utf-8編碼的文件時開頭會有一個多余的字符\ufeff,在讀文件時會讀到\ufeff

 

輸出的\ufeff到底是哪里來的呢?
在編寫文本時保存時包含了BOM(Byte Order Mark,字節順序標記,出現在文本文件頭部,Unicode編碼標准中用於標識文件是采用哪種格式的編碼)導致最后輸出了\ufeff。

其實就是相當於你當初的文件是寫在txt文件中,但是沒有制定utf8編碼,之后將文件改為其它后綴指定了其它編碼導致

解決方案1:

  再讀取文件的時候使用encoding='UTF-8-sig'

解決方案2:

  把原來的json文件復制出來到sublime里面使用utf8編碼保存替換原來的json文件

 因為我是調用的公共方法,所以盡量不對公共方法做修改,采用第二種方案.

 

utf-8與utf-8-sig兩種編碼格式有什么區別呢?
UTF-8以字節為編碼單元,它的字節順序在所有系統中都是一様的,沒有字節序的問題,也因此它實際上並不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。

\ufeff到底是什么?
字節順序標記(英語:byte-order mark,BOM)是位於碼點U+FEFF的統一碼字符的名稱。當以UTF-16或UTF-32來將UCS/統一碼字符所組成的字符串編碼時,這個字符被用來標示其字節序。它常被用來當做標示文件是以UTF-8、UTF-16或UTF-32編碼的記號。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM