官方文檔: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
看看完后,又可以補編碼的知識了!😓
個人學習筆記,翻譯有限,理解翻譯之錯,請指教!