昨天有個release持續build fail,報錯爲c#
error MSB4025: The project file could not be loaded. Data at the root level is invalid. Line 1, position 1.
用Notepad++臨時打開查看,沒有發現任何異常
編輯器
在Stash上能發現文件開始處多了一些小紅點ui
這個 "\ufeff" 就是BOM (byte order marks) [wiki]spa
既然代碼裏有這個,刪除便可,jenkins build success
code
查看了Master上的代碼,沒有這個問題,因此平時也不會有問題。ip
在這個Release Branch上查看History, 發現紅點出自去年的某次提交,而後在這個branch中便一直保留下來了。get
正好昨天merge一些code ,因此帶出來這個問題。jenkins
由於BOM是Windows的默認模式,因此在跨平臺工做的時候,很容易出現這個問題,肉眼很難分辨出來。it
在Unix下用VI作個實驗:io
With BOM
Without BOM
結果立現!
結論 : Windows下默認編輯器的UTF-8是with BOM的,而UTF-16由於涉及到Big-Endian/Little-Endian,也會添加BOM的標識在字節流的開頭。因此建議全部源文件使用UTF-8 without BOM的 格式存儲。