Python學習筆記:BOM

 版權聲明:

本文爲博主原創文章,轉載請註明出處。 https://blog.csdn.net/founderznd/article/details/52197078

#前言

windows對於utf-8編碼的文件自帶BOM,但是其他系統utf-8編碼默認不帶BOM。

這就造成在某些情況下字符解碼會出現問題,比如python自帶的json在讀取在window下編碼得來的utf-8文件時,會報如下錯誤:

ValueError:無法解碼JSON對象

#BOM(維基百科,自由的百科全書)

BOM:字節順序標記(BOM)是一個Unicode字符,U + FEFF BYTE ORDER MARK(BOM),其外觀作爲文本流開頭的幻數可以向使用該文本的程序發出信號:

文本流存儲在哪個字節順序或字節順序中;
事實上,文本流是Unicode,高度自信;
文本流編碼爲的幾種Unicode編碼中的哪一種。
BOM使用是可選的,如果使用,應該出現在文本流的開頭。

Unicode可以編碼爲8位,16位或32位整數。對於16位和32位表示,從任意源接收文本的計算機需要知道整數編碼的字節順序。因爲BOM本身的編碼方式與文檔的其餘部分相同,但是已知值,文本的使用者可以檢查這些前幾個字節以確定編碼。因此,BOM爲文本的製作者提供了一種方式來描述文本流對文本消費者的字節順序,而不需要文本流本身之外的某些合同或元數據。

一旦接收計算機使用了文本流,就可以按照自己的本機字節順序自由處理字符,不再需要BOM。因此,對BOM的需求出現在文本交換的上下文中,而不是在封閉環境中的文本處理中。

一句話總結:BOM對於utf-16和utf-32有用,對於utf-8沒啥大用。。所以能去掉就去掉好了。。

#去掉BOM

方法1:

f = open("data","r")
s = f.read()
u = s.decode("utf-8-sig") # 得到一個不含BOM的unicode string
s = u.encode("utf-8")    # 將unicode轉換爲utf-8
f.close()


方法2:

import codecs

f = open("data","r")
s = f.read()        
if s.startswith(codecs.BOM_UTF8):
    s = s[len(codecs.BOM_UTF8):]
f.close()


--------------------- 
作者:古月河圖 
來源:CSDN 
原文:https://blog.csdn.net/founderznd/article/details/52197078 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章