利用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编码的记号。

 

posted @ 2020-09-29 11:13  lcsp  阅读(2277)  评论(0编辑  收藏  举报