問題出現:
在我測試python中的文本文件的讀取與寫入時,用到了字典對象來存儲讀出的數據。
1 std_data = dict() 2 with open(sys.argv[1], encoding='UTF-8') as fp: 3 alldata = fp.readlines() 4 for item in alldata: 5 no, name = item.rstrip('\n').split('、') 6 std_data[no] = name 7 print(std_data)
在命令行中運行時始終存在一個開頭的\ufeff字符。
測試了幾次都如此。
后來在網上查了一下有不少的接近答案但都沒有回答我心中的問題,只查到了解決方案。
1 no, name = item.encode('utf-8').decode('utf-8-sig').rstrip('\n').split('、')
注:encode('utf-8')和decode('utf-8-sig')需要一起使用,否則會報錯。
不過結果問題確實解決了。
可以清晰的看到開頭的特殊字符確實不見了。
然后我在百度上終於查到了一個比較完整的解釋:
在Windows下用文本編輯器創建的文本文件,如果選擇以UTF-8等Unicode格式保存,會在文件頭(第一個字符)加入一個BOM標識。
ok,到這一步算是有了一個原因讓我信服。接着我又繼續了解了一下BOM是什么鬼。
BOM = Byte Order Mark
BOM是Unicode規范中推薦的標記字節順序的方法。比如說對於UTF-16,如果接收者收到的BOM是FEFF,表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。
UTF-8不需要BOM來表明字節順序,但可以用BOM來表明“我是UTF-8編碼”。BOM的UTF-8編碼是EF BB BF(用UltraEdit打開文本、切換到16進制可以看到)。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
好吧,雖然不太看的懂,但是也算知道了,這是一個utf-8文本的前置說明,表明這是一個utf-8文件嘛。同時BOM也是在編碼方式中的標記字節順序的方法。
接下來學習:BOM標識規范。