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

原文網址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/

#!/usr/bin/python

是用來說明腳本語言是python的

是要用/usr/bin下面的程序(工具)python,這個解釋器,來解釋python腳本,來運行python腳本的。

?

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

是用來指定文件編碼為utf-8的

詳情可以參考:

PEP 0263 — Defining Python Source Code Encodings

?

在此,詳細的(主要是翻譯)解釋一下,為何要加這個編碼聲明,以及如何添加編碼聲明:

?

使用文件編碼聲明以前所遇到的問題

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文件,自然就會報錯了。
必須放在python文件的第一行或第二行 支持的格式,可以有三種:
  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> :
更加精確的解釋是:
  • 符合正則表達式:
    ?
    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
  1. 為了照顧特殊的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加上編碼值
不帶編碼聲明的,默認當做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
    ...

?

python文件編碼聲明所遵循的理念

1.單個的完整的python源碼文件中,只用單一的編碼。

->

不允許嵌入了多種的編碼的數據

否則會導致(python解釋器去解析你的python文件時)報編碼錯誤。

?

不太懂這段:

Any encoding which allows processing the first two lines in the way indicated above is allowed as source code encoding, this includes ASCII compatible encodings as well as certain multi-byte encodings such as Shift_JIS. It does not include encodings which use two or more bytes for all characters like e.g. UTF-16. The reason for this is to keep the encoding detection algorithm in the tokenizer simple.

?

2.這段也不太懂:

Handling of escape sequences should continue to work as it does now, but with all possible source code encodings, that is standard string literals (both 8-bit and Unicode) are subject to escape sequence expansion while raw string literals only expand a very small subset of escape sequences.

?

3.Python的分詞器+編譯器,會按照如下的邏輯去工作:

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

要注意的是:

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

?

其余的內容,不翻譯了。

至此,已經解釋的夠清楚了。

?

轉載于:https://www.cnblogs.com/wi100sh/p/4238933.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376316.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式系統介紹-PNUTS

PNUTS是Yahoo!的分布式數據庫系統&#xff0c;支持地域上分布的大規模并發操作。它根據主鍵的范圍區間或者其哈希值的范圍區間將表拆分為表單元&#xff08;Tablet&#xff09;&#xff0c;多個表單元存儲在一個服務器上。一個表單元控制器根據服務器的負載情況&#xff0c;進行…

Jmeter BeanShell學習(一) - BeanShell取樣器(二)

利用BeanShell取樣器獲取接口返回的JSON格式的結果&#xff0c;并將該結果寫入到文件。 第一步&#xff1a;添加BeanShell取樣器 前面幾個取樣器的內容查看&#xff1a; https://blog.csdn.net/goodnameused/article/details/96985514 第二步&#xff1a;查看返回的結果格式 …

在數據庫中outlet、code、outline為聯合組件。hibarnate插入可如此插入

hibarnate對象的映射文件如下 <id name"outlet" type"string"> <column name"OUTLET" length"10" /> <generator class"assigned" /> </id> <!-- <property name"code" type"…

日怎么沒人告訴我這博客可以改博文界面的顯示寬度的

于是我妥妥的回歸了。 weebly雖然定制功能強大&#xff0c;還能穿越時空發博文&#xff0c;但是太麻煩了&#xff0c;而且用著也不像一個博客。 既然解決了這個問題&#xff0c;那Lofter除了行間距也沒什么缺點了&#xff0c;接著用吧&#xff0c;反正weebly也傳不了大圖&#…

160 - 50 DueList.5

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查殼 可以看出程序有加殼&#xff0c;那么我們下一步就是脫殼了。 0x01 脫殼 看上去沒什么特別的地方&#xff0c;就直接 單步跟蹤法 來脫殼吧 近call F7&#xff0c;遠call F8 來到這里 哈&…

firefox瀏覽器中silverlight無法輸入問題

firefox瀏覽器中silverlight無法輸入問題今天用firefox瀏覽silverlight網頁&#xff0c;想在文本框中輸入內容&#xff0c;卻沒想到silverlight插件意外崩潰了。google一下&#xff0c;發現這是firefox的設置問題&#xff0c;解決方法如下&#xff1a; 1、在Firefox瀏覽器地址欄…

關鍵路徑的概念和算法

AOE網&#xff1a;在一個表示工程的帶權有向圖中&#xff0c;用頂點表示事件&#xff0c;用有向邊表示活動&#xff0c;邊上的權值表示活動的持續時間&#xff0c;稱這樣的有向圖叫做邊表示活動的網&#xff0c;簡稱AOE網。AOE網中沒有入邊的頂點稱為始點&#xff08;或源點&am…

160 - 51 DueList.6

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查殼 發現程序沒有加殼&#xff0c;那么我們可以直接分析了。 0x01 分析 運行程序看一看 看到錯誤信息的字符串后我們可以直接搜索了。 可以看到程序會比較輸入的長度是否為8位&#xff0c;如…

寬帶上行速率和下行速率的區別

本文由廣州寬帶網http://www.ymeibai.com/整理發布&#xff0c;廣州電信寬帶報裝&#xff0c;上廣州寬帶網。 我們一般所說的4M寬帶&#xff0c;6M寬帶&#xff0c;都是指寬帶的下行速率&#xff0c;可以理解為就是下載的速度&#xff0c;平時我們用迅雷、或者網頁下載軟件時&a…

LazyInitializationException--由于session關閉引發的異常

1,頁面中進行person.department.departmentName的讀取 2,Action 中只讀取了person&#xff0c;事務作用在Service的方法中 3,后臺會有org.hibernate.LazyInitializationException出現 因為&#xff1a;Action中Service方法結束之前&#xff0c;session已經關閉了轉載于:https:/…

160 - 52 egis.1

環境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查殼 加了UPX殼&#xff0c;那么就要脫殼了。可以使用單步法來脫殼。 UPX殼還是比較簡單的&#xff0c;開頭pushad&#xff0c;找個popad&#xff0c;然后就是jmp了。 然后就可以用OD來…

玩轉MySQL之Linux下的簡單操作(服務啟動與關閉、啟動與關閉、查看版本)

小弟今天記錄一下在Linux系統下面的MySQL的簡單使用&#xff0c;如下&#xff1a; 服務啟動與關閉 啟動與關閉 查看版本 環境 Linux版本&#xff1a;centeros 6.6&#xff08;下面演示&#xff09;&#xff0c;Ubuntu 12.04&#xff08;參見文章末尾紅色標注字體&#xff09; M…

實驗八第二題

轉載于:https://www.cnblogs.com/huangsilinlana/p/3411550.html

c++ boost多線程學習(一)

本次學習相關資料如下&#xff1a; Boost C 庫 第 6 章 多線程&#xff08;大部分代碼的來源&#xff09; Boost程序庫完全開發指南 - 深入C“準”標準庫 第三版 羅劍鋒著 頭文件&#xff1a; #include <stdio.h> #include <string.h> #include <boost\versio…

C#中什么是泛型

所謂泛型是指將類型參數化以達到代碼復用提高軟件開發工作效率的一種數據類型。一種類型占位符&#xff0c;或稱之為類型參數。我們知道一個方法中&#xff0c;一個變量的值可以作為參數&#xff0c;但其實這個變量的類型本身也可以作為參數。泛型允許我們在調用的時候再指定這…

敏捷自動化測試(1)—— 我們的測試為什么不夠敏捷?

測試是為了保證軟件的質量&#xff0c;敏捷測試關鍵是保證可以持續、及時的對軟件質量情況進行全面的反饋。由于在敏捷開發過程中每個迭代都會增加功能、修復缺陷或重構代碼&#xff0c;所以在完成當前迭代新增特性測試工作的同時&#xff0c;還要通過回歸測試來保證歷史功能不…

學習c++

目錄 一 、 boost庫&#xff1a; 1. 多線程 c boost多線程學習&#xff08;一&#xff09; 二 、數據庫&#xff1a; 三、socket編程&#xff1a; c socket學習&#xff08;1.1&#xff09; c socket學習&#xff08;1.2&#xff09; c socket學習&#xff08;1.3&#x…

mysql5.6與mysql5.5不同

1.編譯階段 要明白with與without的區別&#xff0c;選項值分1和0&#xff0c;或者對應為on或off&#xff0c;代表支持與不支持&#xff1b;with的1&#xff08;on&#xff09;與without的0&#xff08;off&#xff09;是同樣的&#xff0c;with的0&#xff08;off&#xff09;與…

c++ 基本排序算法學習

C實現排序算法 代碼地址 vector<unsigned int> cVec; int nSize cVec.size();1 冒泡排序 算法思路&#xff1a; 每兩兩相鄰的數值都會比較大小&#xff0c;前面比后面大的時候就交換位置&#xff0c;否則就不動。 代碼&#xff1a; void BubbleSort() {//優化&#x…

ios 程序學習

馬上著手開發iOS應用程序&#xff1a;五、提交應用與尋找信息 2013-01-11 15:36 佚名 apple.com 我要評論(0) 字號&#xff1a;T | T本文介紹了您已經學習完如何開發一個優秀的iOS應用之后&#xff0c;應該掌握的內容&#xff0c;包括將您的應用提交到App Store讓其他人下載&am…