1. 程式人生 > >【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型

【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型

ron 標識 精確 log 解析器 開始 html weight .org

下面的內容來自: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 -*-

對此格式的詳細解釋是:

  1. 如果沒有此文件編碼類型的聲明,則 python 默認以ASCII編碼去處理;如果你沒聲明編碼,但是文件中又包含非ASCII編碼的字符的話,python解析器去解析的 python 文件,自然就會報錯了。
  2. 必須放在python文件的第一行或第二行
  3. 支持的格式,可以有三種:
    1. 帶等於號的:
      # coding=<encoding name>
    2. 最常見的,帶冒號的(大多數編輯器都可以正確識別的):
      #!/usr/bin/python
      # -*- coding: <encoding name> -*-
    3. vim的:
      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :
  4. 更加精確的解釋是:
    • 符合正則表達式:
      "^[ \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
  5. 為了照顧特殊的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的分詞器+編譯器,會按照如下的邏輯去工作:

  1. 讀取文件
  2. 不同的文件,根據其聲明的編碼去解析為Unicode
  3. 轉換為UTF-8字符串
  4. 針對UTF-8字符串,去分詞
  5. 編譯之,創建Unicode對象

要註意的是:

Python中的標識符,都是ASCII的。

寫的很明白啊;

【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型