python 字符串編碼 ,區別 utf-8 和utf-8-sig

Python 讀取文件首行多了"\ufeff"字符串

python讀取B.txt文件時,控制檯打印首行正常,可是如果用首行內容打開文本的話,就會報錯:python

Traceback (most recent call last):
A
  File "E:/python project/multiProcess/test.py", line 32, in <module>
    with open("%s.txt" % line, 'r', encoding='utf-8') as f1:
FileNotFoundError: [Errno 2] No such file or directory: '\ufeffA.txt'

  

要打開的路徑比預期A.txt多了一串字符"\ufeff", 顯然沒法正確打開文件.json

解決方案:

在讀取B.txt 時,指定編碼方式爲 "utf-8-sig"便可 以下:編碼

with open("B.txt", 'r', encoding='utf-8-sig') as f:
    line = f.readline()[0:-1]  #去掉末尾換行符
    print(line)
    with open("%s.txt" % line, 'r', encoding='utf-8') as f1:
        print(f1.readline())
    f1.close()
f.close()

  

首行出現的」\ufeff「叫BOM("ByteOrder Mark")用來聲明該文件的編碼信息.spa

」utf-8「 是以字節爲編碼單元,它的字節順序在全部系統中都是同樣的,沒有字節序問題,所以它不須要BOM,因此當用"utf-8"編碼方式讀取帶有BOM的文件時,它會把BOM當作是文件內容來處理, 也就會發生相似上邊的錯誤..net

"uft-8-sig"中sig全拼爲 signature 也就是"帶有簽名的utf-8", 所以"utf-8-sig"讀取帶有BOM的"utf-8文件時"會把BOM單獨處理,與文本內容隔離開,也是咱們指望的結果.

原文:https://blog.csdn.net/wozaizhe56/article/details/82048645 code

 

 

  • 摘要:問題描述:json.loads(text,encoding='utf8')報UnexpectedUTF-8BOM(decodeusingutf-8-sig)錯誤,將encoding改成'utf-8-sig'仍然報錯。緣由分析:text包含BOM字符解決方案:將BOM頭去掉blog

  • 問題描述:utf-8

    json.loads(text,encoding='utf8') 報Unexpected UTF-8 BOM (decode using utf-8-sig)錯誤,將encoding改成'utf-8-sig'仍然報錯。字符串

    緣由分析:string

    text包含BOM字符

    解決方案:

    將BOM頭去掉,代碼以下:

if text.startswith(u'/ufeff'): text = text.encode('utf8')[3:].decode('utf8')
連接:https://www.jianshu.com/p/f94b3fc04f5b
相關文章
相關標籤/搜索