【原創】Python 源文件編碼解讀


如下內容源於對 PEP-0263 的翻譯和解讀,同時給出了一些網上網友的說法。

========  我是分割線 ========

原文地址:PEP 0263 -- Defining Python Source Code Encodingspython

【摘要】

      給出聲明 Python 源文件編碼的語法。該編碼信息後續會被 Python 解析器用於解析源文件。
      這種方式加強了對源文件中 Unicode 編碼字的處理。正則表達式

【問題】

      Python 2.1 時代,Unicode 字符只能採用基於 Latin-1 字符進行「Unicode 轉義」的方式來表示(也就是說當時只支持 Latin-1 字符編碼,因此 Unicode 字符編碼只能使用 Latin-1 字符來進行轉義表示)。這對廣大亞洲人民是很坑爹的。vim

【解決方案】

      經過在 Python 腳本文件的頭部增長 顯式的可按文件隨時改變的 特殊註釋,來聲明編碼方式。編碼

【編碼定義】

      Python 默認使用 ASCII 編碼。
      若要自定義 Python 源碼的編碼方式,須要在腳本文件的第一或者第二行的位置上添加以下定義:
1. 方式一(第一行)spa

# coding=<encoding name>

2. 方式二(第二行)翻譯

#!/usr/bin/python
# -*- coding: <encoding name> -*-

3. 方式三(第二行)code

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

在前兩種方式中,其實是經過 coding[:=]\s*([-\w.]+) 這個正則表達式來進行匹配。          

      爲了支持 Windows 平臺上的應用,會在生成的 Unicode 文件的頭部添加 Unicode BOM 標識,其中帶有 UTF-8 標識 '\xef\xbb\xbf' 的文件會被當作具備 UTF-8 編碼的文件(此時在 Python 腳本的頭部沒有那行編碼特殊註釋也沒問題) 。

      若是出現源文件同時使用了 UTF-8 BOM 標識和文件頭部的特殊註釋的狀況,那麼在代表編碼的特殊註釋中只能使用 'utf-8' 這個字串,其餘狀況會報錯。utf-8

【舉例】

1. Python 解析器說明 + Emacs 風格的文件編碼註釋ci

#!/usr/bin/python
# -*- coding: latin-1 -*-
import os, sys
...
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os, sys
...
#!/usr/bin/python
# -*- coding: ascii -*-
import os, sys
...

2. 無 Python 解析器說明 + 普通明文描述get

# This Python file uses the following encoding: utf-8
import os, sys
...

3. Python 解析器說明 + 非 Emacs 風格的文件編碼註釋

#!/usr/local/bin/python
# coding: latin-1
import os, sys
...

4. 無編碼註釋(Python 解析器默認爲 ASCII)

#!/usr/local/bin/python
import os, sys
...

5. 錯誤的編碼註釋方式
a. 無 coding: 前綴

#!/usr/local/bin/python
# latin-1
import os, sys
...

b. 編碼註釋不在第一或第二行

#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import os, sys
...

c. 使用不支持的編碼

#!/usr/local/bin/python
# -*- coding: utf-42 -*-
import os, sys
...


=========== 我是分割線 ============

小實驗截圖:
輸出中文。

報錯。
添加編碼。

正常輸出。

IDE默認的編碼設置。

各類轉碼輸出。

輸出的結果。


補充說明: cp936即 code page 936(代碼頁936)是以GBK(國標擴展字符集)爲基礎的編碼。GB2312(國標字符集)只是GBK的一部分。 GB2312只支持經常使用的漢字,並且是簡體字。GBK支持繁體字和生僻字。  

相關文章
相關標籤/搜索