【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型
下面的內容來自:http://www.cnblogs.com/blueskylcc/p/5332642.html, 對方也是轉的,不過沒有找到轉載的出處;
1、#!/usr/bin/python
是用來說明腳本語言是 python 的
是要用 /usr/bin下面的程序(工具)python,這個解釋器,來解釋 python 腳本,來運行 python 腳本的。
2、# -*- coding: utf-8 -*-
是用來指定文件編碼為 utf-8 的
詳情可以參考:PEP 0263 — Defining Python Source Code Encodings
在此,詳細的(主要是翻譯)解釋一下,為何要加這個編碼聲明,以及如何添加編碼聲明:
2.1 使用文件編碼聲明以前所遇到的問題
Python 2.1 中,想要輸入 Unicode 字符,只能用基於 Latin-1 的 "unicode-escape" 的方式輸入 -> 對於其他非 Latin-1 的國家和用戶,想要輸入 Unicode 字符,就顯得很繁瑣,不方便。
希望是:
編程人員,根據自己的喜好和需要,以任意編碼方式輸入字符串,都可以,這樣才正常。
2.2 建議選用的方案
所以,才有人給 Python 官方建議,所以才有此PEP 0263。
此建議就是:
允許在 Python 文件中,通過文件開始處的,放在註釋中的,字符串形式的,聲明,聲明自己的 python 文件,用何種編碼。
由此,需要很多地方做相應的改動,尤其是 Python 文件的解析器,可以識別此種文件編碼聲明。
2.3 具體如何聲明python文件編碼?
上面已經說了,是,文件開始處的,放在註釋中的,字符串形式的,聲明。
那具體如何聲明,以什麽樣的格式去聲明呢?
其實就是,你之前就見過的,這種:
# -*- coding: utf-8 -*-
對此格式的詳細解釋是:
- 如果沒有此文件編碼類型的聲明,則 python 默認以ASCII編碼去處理;如果你沒聲明編碼,但是文件中又包含非ASCII編碼的字符的話,python解析器去解析的 python 文件,自然就會報錯了。
- 必須放在python文件的第一行或第二行
- 支持的格式,可以有三種:
- 帶等於號的:
# coding=<encoding name>- 最常見的,帶冒號的(大多數編輯器都可以正確識別的):
#!/usr/bin/python # -*- coding: <encoding name> -*-- vim的:
#!/usr/bin/python # vim: set fileencoding=<encoding name> :- 更加精確的解釋是:
- 符合正則表達式:
"^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)"- 的都可以,很明顯,如果你熟悉正則表達式,也就可以寫出來,其他一些合法的編碼聲明,以 utf-8 為例,比如:
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,否則(由於聲明的編碼和實際編碼不一致,自然)會報錯;
2.4 python文件編碼聲明所遵循的理念
1.單個的完整的python源碼文件中,只用單一的編碼。
->不允許嵌入了多種的編碼的數據,否則會導致(python解釋器去解析你的python文件時)報編碼錯誤。
2.Python的分詞器+編譯器,會按照如下的邏輯去工作:
- 讀取文件
- 不同的文件,根據其聲明的編碼去解析為Unicode
- 轉換為UTF-8字符串
- 針對UTF-8字符串,去分詞
- 編譯之,創建Unicode對象
要註意的是:
Python中的標識符,都是ASCII的。
寫的很明白啊;
【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型