1. 程式人生 > >Python中的 #!/usr/bin/python 和 # -*- coding: utf-8 -*-

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

# -*- coding: utf-8 -*-

對此格式的詳細解釋是:

  1. 如果沒有此檔案編碼型別的宣告,則python預設以ASCII編碼去處理。如果你沒宣告編碼,但是檔案中又包含非ASCII編碼的字元的話,python解析器去解析的python檔案,自然就會報錯了。
  2. 必須放在python檔案的第一行或第二行
  3. 支援的格式,可以有三種:
    1. 帶等於號的:

      1

      # coding=<encoding name>

    2. 最常見的,帶冒號的(大多數編輯器都可以正確識別的):

      1

      2

      #!/usr/bin/python

      # -*- coding: <encoding name> -*-

    3. vim的:

      1

      2

      #!/usr/bin/python

      # vim: set fileencoding=<encoding name> :

  4. 更加精確的解釋是:

    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

  5. 為了照顧特殊的Windows中的帶BOM(’\xef\xbb\xbf’)的UTF-8
    1. 如果你的python檔案本身編碼是帶BOM的UTF-8,即檔案前三個位元組是:’\xef\xbb\xbf’,那麼:
      1. 即使你沒有宣告檔案編碼,也自動當做是UTF-8的編碼
      2. 如果你聲明瞭檔案編碼,則必須是聲明瞭(和你檔案編碼本身相一致的)UTF-8
        1. 否則(由於宣告的編碼和實際編碼不一致,自然)會報錯

檔案編碼宣告的各種例子

針對上面的規則,下面給出各種,合法的,非法的,例子,供參考:

合法的python檔案編碼宣告

  1. 帶聲明瞭直譯器的,Emacs風格的,(註釋中的)檔案編碼宣告
    1. 例子1:

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: latin-1 -*-

      import os, sys

      ...

    2. 例子2:

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: iso-8859-15 -*-

      import os, sys

      ...

    3. 例子3:

      1

      2

      3

      4

      #!/usr/bin/python

      # -*- coding: ascii -*-

      import os, sys

      ...

  2. 不帶聲明瞭直譯器的,直接用純文字形式的:

    1

    2

    3

    # This Python file uses the following encoding: utf-8

    import os, sys

    ...

  3. 文字編輯器也可以有多種(其他的)定義編碼的方式:

    1

    2

    3

    4

    #!/usr/local/bin/python

    # coding: latin-1

    import os, sys

    ...

    很明顯,其中的沒用-*-,直接用了coding加上編碼值
  4. 不帶編碼宣告的,預設當做ASCII處理:

    1

    2

    3

    #!/usr/local/bin/python

    import os, sys

    ...

非法的python檔案編碼宣告舉例

  1. 少了coding:字首

    1

    2

    3

    4

    #!/usr/local/bin/python

    # latin-1

    import os, sys

    ...

  2. 編碼宣告不在第一行或第二行:

    1

    2

    3

    4

    5

    #!/usr/local/bin/python

    #

    # -*- coding: latin-1 -*-

    import os, sys

    ...

  3. 不支援的,非法的字元編碼(字串)宣告:

    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/