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


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

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

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", 顯然無法正確打開文件.

解決方案:

在讀取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")用來聲明該文件的編碼信息.

”utf-8“ 是以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序問題,因此它不需要BOM,所以當用"utf-8"編碼方式讀取帶有BOM的文件時,它會把BOM當做是文件內容來處理, 也就會發生類似上邊的錯誤.

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

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

 

 

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

  • 問題描述:

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

    原因分析:

    text包含BOM字符

    解決方案:

    將BOM頭去掉,代碼如下:

 if text.startswith(u'/ufeff'): text = text.encode('utf8')[3:].decode('utf8')


鏈接:https://www.jianshu.com/p/f94b3fc04f5b


免責聲明!

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



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