2013-09-28 27 views
3

出於某種原因,在我的腳本之一的家當不工作:家當可執行沒有發現,因爲UTF-8 BOM(字節順序標記)

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
print "Hello World" 

當我執行這個文件,我得到一個錯誤

% ./test.py 
./test.py: 1: #!/usr/bin/env: not found 

沒有與我/usr/bin/目錄的內容沒有問題:既envpython在那裏,用正確的執行權。

回答

4

這是由於Unix和Linux如何處理shebang。 #!必須是文件中的前兩個字節。如果你有一個BOM,那麼這不再是真的,因此錯誤。

請注意,從python解釋器的角度來看,放置BOM是完全沒用的,因爲# -*- coding: utf-8 -*-已經告訴python編碼。

AFAIK BOM通常是而不是與utf-8一起使用。它用於UTF-16和similia以指定字節順序。如果編輯器採用錯誤的編碼,您應該能夠使用正確的編碼顯式打開文件。

+0

事實上,根據Unicode標準,「對於UTF-8既不要求也不建議使用BOM ,但在其他編碼形式(其中 使用BOM或將BOM用作UTF-8簽名)轉換爲UTF-8數據的上下文中可能會遇到 。 –

+0

雖然編輯器提供的默認* UTF8編碼(簡稱爲「UTF-8」)實際上是一種使用BOM的「風險」編碼,但對於不知情的程序員來說,使用Notepad ++犯的錯誤的風險很高。 –

+0

@Sebastien Notepad ++是一個* Windows *程序。如果你想用一個衆所周知的編輯器來生成跨平臺代碼,那麼你就必須在所有配置上測試代碼,因爲編輯器不會關心這些細節以使代碼可移植。即使使用更多試圖跨平臺的開放式軟件,情況也是如此。 – Bakuriu

4

問題的原因是我的文件使用帶有BOM(字節順序標記)的UTF8編碼。

刪除BOM,即使用不使用BOM的UTF8對文件進行編碼即可解決問題。

注意:對於Notepad ++用戶,在編輯器中也會將「UTF8 without BOM」稱爲(奇怪)「ANSI as UTF-8」。

+0

這甚至在Unicode常見問題解答中提到:http://unicode.org/faq/utf_bom.html#bom5 – Philipp

相關問題