如下內容源於對 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支持繁體字和生僻字。