PEP 263 -- Defining Python Source Code Encodings(定義Python源代碼編碼)


官方文檔:https://www.python.org/dev/peps/pep-0263/

概要

這個PEP建議引入一個語法來聲明Python源文件的編碼。 Python解析器將使用這個編碼信息中給定的編碼來解釋文件。 最引人注意的是,這增強了源代碼中Unicode字符的解釋。

 

問題描述

在Python 2.1中,Unicode字符只能使用基於Latin-1的“unicode-escape”編碼編寫。 這對生活和工作在非Latin-1語言環境(如許多亞洲國家)的Python用戶來說是不友好的。 程序員可以使用最喜歡的編碼來編寫他們的8位字符串,但是他們被綁定到非得使用“unicode-escape”來編碼Unicode字符。

 

解決方案

我建議在python源代碼文件頂部的使用特殊注釋來聲明編碼,使Python源代碼的編碼在每個源文件的基礎上可見和可變。

為了使Python解釋器意識到這個編碼聲明,在處理Python源代碼數據方面需要進行一些概念更改。

 

定義編碼

如果沒有給出其他編碼提示,Python將默認將ASCII作為標准編碼。

要定義源代碼編碼,必須將編碼聲明放在源文件中,或者作為文件中的第一行或第二行,例如:

#coding=<encoding name>

 

或(使用各種流行的編輯器都認可的格式):

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

 

或者

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

更准確地說,第一行或第二行必須與以下正則表達式相匹配:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

 

此表達式的第一組然后解釋為編碼名稱。 如果編碼對於Python是未知的,編譯過程中會出現錯誤。 在包含編碼聲明的行上不能有任何Python語句。 如果第一行匹配第二行被忽略。

為了幫助那些將Unicode BOM標記添加到Unicode文件的開頭的操作系統,比如Windows的平台,,UTF-8簽名\ xef \ xbb \ xbf也將被解釋為’utf-8’編碼(即使沒有編碼聲明中 給出)。

如果源文件使用UTF-8 BOM標記簽名和編碼聲明,則該文件的唯一允許的編碼為“utf-8”。 任何其他編碼都會導致錯誤。

 

示例

1.設置其他非utf-8字符

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
print('阿甘')
 

結果:

 

 

 2.設置utf-8字符

#!/usr/local/bin/python
# coding:utf-8
print('阿甘')

結果:

 

3.設置沒有的字符

#!/usr/local/bin/python
# coding:utf-88
print('阿甘')

 

結果:

 

概念

PEP基於以下概念,必須實現這些概念才能使用這種注釋:

1.完整的Python源代碼文件應該使用單一編碼。不允許嵌入不同編碼的數據,在編譯Python源代碼時將導致解碼錯誤。

任何允許以上述方式處理前兩行的編碼都可以作為源代碼編碼,這包括ASCII兼容編碼以及某些多字節編碼,比如Shift_JIS,unicode。它不包括對所有字符(如UTF-16)使用兩個或多個字節的編碼。這樣做的原因是為了使標記器中的編碼檢測算法保持簡單 。

2.轉義序列的處理應該像現在一樣繼續工作,但是對於所有可能的源代碼編碼,即標准字符串字面量(8位和Unicode)都可以進行轉義序列擴展,而原始字符串字面量只擴展了轉義序列的一個非常小的子集。

 

3.python的編譯器將進行如下的轉換工作:

A.讀取文件

B.將其解碼為Unicode,假設每個文件有固定的編碼

C.將其轉換為UTF-8字節字符串

D.處理UTF-8的內容

E.編譯它,從給定的Unicode數據中創建Unicode對象,並通過使用給定的文件編碼將UTF-8數據重新編碼為8 位字符串數據,從Unicode文字數據創建字符串對象

 請注意,Python標識符僅限於編碼的ASCII子集,因此不需要在步驟之后進行進一步的轉換

 

reference:https://blog.csdn.net/u013793383/article/details/73369315

 看看完后,又可以補編碼的知識了!😓

 個人學習筆記,翻譯有限,理解翻譯之錯,請指教!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM