1. 程式人生 > >讀取文字出現 鍩 * 系列亂碼錯誤(UTF-8 BOM問題)的原因及解決方法

讀取文字出現 鍩 * 系列亂碼錯誤(UTF-8 BOM問題)的原因及解決方法

現象

讀取文字時經常會出現鍩*系列錯誤。
例1:鍩縣,其實開頭的文字是h,http被顯示為鍩縣ttp
例2:鍩縫,其實開頭的文字是p,public被顯示為鍩縫ulic
只要文字的首字母為鍩的都屬於這類錯誤,在Python、Java、PHP等等使用過程中都會遇到,這類錯誤與語言無關,錯誤的原因是UTF-8的BOM。

原因

BOM即Byte Order Mark,是UTF-8文件的Unicode簽名,即EF BB BF這三個位元組,當把檔案編碼選為UTF-8時,系統會自動在檔案頭部新增上EF BB BF這三個位元組,而選為UTF-8 NO BOM時會自動去掉這三個位元組。
BOM是可選的,可以用來檢測一個位元組流是否是UTF-8編碼的。微軟做這種檢測,但有些軟體不做這種檢測,而把它當作正常字元處理。
微軟在自己的UTF-8格式的文字檔案之前加上了EF BB BF三個位元組, windows上面的notepad等程式就是根據這三個位元組來確定一個文字檔案是ASCII的還是UTF-8的,然而這個只是微軟暗自作的標記,其它平臺上並沒有對UTF-8文字檔案做個這樣的標記。

解決辦法

  1. 儘量使用notepad++,sublime,editplus等不直接加BOM的文字編輯器
  2. 使用ultraedit等二進位制編輯器去除BOM
  3. 使用1中的編輯器重新開啟文件並重新儲存為以UTF-8無BOM格式編碼。
  4. 將編碼設定為ASCII,當然這也很多中文就麻煩了
  5. 用Python去除BOM
import codecs

data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
     data = data[3:]
print data.decode("utf-8")