UTF-8分為兩種,一種是不帶BOM的,一種是帶BOM的。其中第一種不帶BOM的是標(biāo)準(zhǔn)形式,第二種帶BOM的主要是微軟的習(xí)慣。
微軟在UTF-8中使用BOM(Byte order mark)是因為這樣可以將UTF-8和ASCII等編碼明確區(qū)分開。?
windows對于utf-8格式的文件存儲默認是帶有BOM的格式
因為在UNIX環(huán)境下,很多的UNIX程序不認識BOM。主要是在UNIX所有腳本語言首行為#!標(biāo)示,它依賴于shell解析,而很多shell出于兼容的考慮不檢測BOM,所以加進BOM時shell會把它解釋為某個普通字符輸入導(dǎo)致破壞#!標(biāo)示。比如很多現(xiàn)代腳本語言,例如python,其解釋器本身是能處理BOM的,但是shell卡在這里。?
因此我們在linux服務(wù)器上讀取這些txt文件時,會遇到如下報錯:?
\xef\xbb\xbf…
解決方法
import codecs
with open("xx.txt",'r','utf-8-sig') as file:
? ? ? ? line = file.readlines()
或者:
#打開文件,此次應(yīng)指定編碼,
fr=open(filename,'r',encoding='utf-8')
#讀取文件所有內(nèi)容
arrayOLines=fr.readlines()
#針對有BOM的UTF-8文本,應(yīng)該去掉BOM,否則后面會引發(fā)錯誤。
arrayOLines[0]=arrayOLines[0].lstrip('\ufeff')