Python中的 #!/usr/bin/python 和 # -*- coding: utf-8 -*-
#!/usr/bin/python
是用來說明指令碼語言是python的
是要用/usr/bin下面的程式(工具)python,這個直譯器,來解釋python指令碼,來執行python指令碼的。
# -*- coding: utf-8 -*-
是用來指定檔案編碼為utf-8的
詳情可以參考:
在此,詳細的(主要是翻譯)解釋一下,為何要加這個編碼宣告,以及如何新增編碼宣告:
使用檔案編碼宣告以前所遇到的問題
Python 2.1中,想要輸入Unicode字元,只能用基於Latin-1的"unicode-escape"的方式輸入 -> 對於其他非Latin-1的國家和使用者,想要輸入Unicode字元,就顯得很繁瑣,不方便。
希望是:
程式設計人員,根據自己的喜好和需要,以任意編碼方式輸入字串,都可以,這樣才正常。
建議選用的方案
所以,才有人給Python官方建議,所以才有此PEP 0263。
此建議就是:
允許在Python檔案中,通過檔案開始處的,放在註釋中的,字串形式的,宣告,宣告自己的python檔案,用何種編碼。
由此,需要很多地方做相應的改動,尤其是Python檔案的解析器,可以識別此種檔案編碼宣告。
具體如何宣告python檔案編碼?
上面已經說了,是,檔案開始處的,放在註釋中的,字串形式的,宣告。
那具體如何宣告,以什麼樣的格式去宣告呢?
其實就是,你之前就見過的,這種:
1 |
|
對此格式的詳細解釋是:
- 如果沒有此檔案編碼型別的宣告,則python預設以ASCII編碼去處理。如果你沒宣告編碼,但是檔案中又包含非ASCII編碼的字元的話,python解析器去解析的python檔案,自然就會報錯了。
- 必須放在python檔案的第一行或第二行
- 支援的格式,可以有三種:
- 帶等於號的:
1
# coding=<encoding name>
- 最常見的,帶冒號的(大多數編輯器都可以正確識別的):
1
2
#!/usr/bin/python
# -*- coding: <encoding name> -*-
- vim的:
1
2
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
- 帶等於號的:
- 更加精確的解釋是:
1
2
3
4
5
coding: utf
-
8
coding
=
utf
-
8
coding
=
utf
-
8
encoding:utf
-
8
crifanEncoding
=
utf
-
8
- 符合正則表示式:
1
"coding[:=]\s*([-\w.]+)"
- 的都可以,很明顯,如果你熟悉正則表示式,也就可以寫出來,其他一些合法的編碼宣告,以utf-8為例,比如:
1
2
3
4
5
coding: utf
-
8
coding
=
utf
-
8
coding
=
utf
-
8
encoding:utf
-
8
crifanEncoding
=
utf
-
8
- 符合正則表示式:
- 為了照顧特殊的Windows中的帶BOM(’\xef\xbb\xbf’)的UTF-8:
- 如果你的python檔案本身編碼是帶BOM的UTF-8,即檔案前三個位元組是:’\xef\xbb\xbf’,那麼:
- 即使你沒有宣告檔案編碼,也自動當做是UTF-8的編碼
- 如果你聲明瞭檔案編碼,則必須是聲明瞭(和你檔案編碼本身相一致的)UTF-8
- 否則(由於宣告的編碼和實際編碼不一致,自然)會報錯
- 如果你的python檔案本身編碼是帶BOM的UTF-8,即檔案前三個位元組是:’\xef\xbb\xbf’,那麼:
檔案編碼宣告的各種例子
針對上面的規則,下面給出各種,合法的,非法的,例子,供參考:
合法的python檔案編碼宣告
- 帶聲明瞭直譯器的,Emacs風格的,(註釋中的)檔案編碼宣告
- 例子1:
1
2
3
4
#!/usr/bin/python
# -*- coding: latin-1 -*-
import
os, sys
...
- 例子2:
1
2
3
4
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import
os, sys
...
- 例子3:
1
2
3
4
#!/usr/bin/python
# -*- coding: ascii -*-
import
os, sys
...
- 例子1:
- 不帶聲明瞭直譯器的,直接用純文字形式的:
1
2
3
# This Python file uses the following encoding: utf-8
import
os, sys
...
- 文字編輯器也可以有多種(其他的)定義編碼的方式:
很明顯,其中的沒用-*-,直接用了coding加上編碼值1
2
3
4
#!/usr/local/bin/python
# coding: latin-1
import
os, sys
...
- 不帶編碼宣告的,預設當做ASCII處理:
1
2
3
#!/usr/local/bin/python
import
os, sys
...
非法的python檔案編碼宣告舉例
- 少了coding:字首
1
2
3
4
#!/usr/local/bin/python
# latin-1
import
os, sys
...
- 編碼宣告不在第一行或第二行:
1
2
3
4
5
#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import
os, sys
...
- 不支援的,非法的字元編碼(字串)宣告:
1
2
3
4
#!/usr/local/bin/python
# -*- coding: utf-42 -*-
import
os, sys
...
原文連結:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/