python源文件编码的含义_【原创】Python 源文件编码解读
以下內(nèi)容源于對(duì) PEP-0263 的翻譯和解讀,同時(shí)給出了一些網(wǎng)上網(wǎng)友的說(shuō)法。
======== ?我是分割線 ========
PEP 0263 -- Defining Python Source Code Encodings
【摘要】
給出聲明 Python 源文件編碼的語(yǔ)法。該編碼信息后續(xù)會(huì)被 Python 解析器用于解析源文件。
這種方式增強(qiáng)了對(duì)源文件中 Unicode 編碼字的處理。
【問題】
Python 2.1 時(shí)代,Unicode 字符只能利用 Latin-1 字符進(jìn)行“Unicode 轉(zhuǎn)義”的方式來(lái)表示(也就是說(shuō)當(dāng)時(shí)只支持 Latin-1 字符編碼,所以 Unicode 字符編碼只能使用 Latin-1 字符來(lái)進(jìn)行轉(zhuǎn)義表示)。這對(duì)廣大亞洲人民是很坑爹的。
【解決方案】
通過(guò)在 Python 腳本文件的頭部增加 顯式的、可按文件隨時(shí)改變的 特殊注釋,來(lái)聲明編碼方式。
【編碼定義】
Python 默認(rèn)使用 ASCII 編碼。
若要自定義 Python 源碼的編碼方式,需要在腳本文件的第一或者第二行的位置上添加如下定義:
1.
# coding=
2.
#!/usr/bin/python
# -*- coding: -*-
3.
#!/usr/bin/python
# vim: set fileencoding= :
在前兩種方式中,實(shí)際上是通過(guò) coding[:=]\s*([-\w.]+) 這個(gè)正則表達(dá)式來(lái)進(jìn)行匹配。
為了支持 Windows 平臺(tái)上的應(yīng)用,會(huì)在生成的 Unicode 文件的頭部添加 Unicode BOM 標(biāo)識(shí),其中帶有 UTF-8 標(biāo)識(shí) '\xef\xbb\xbf' 的文件會(huì)被當(dāng)做具有 UTF-8 編碼的文件(此時(shí)在 Python 腳本的頭部沒有那行編碼特殊注釋也沒問題) 。
如果出現(xiàn)源文件同時(shí)使用了 UTF-8 BOM 標(biāo)識(shí)和文件頭部的特殊注釋的情況,那么在表明編碼的特殊注釋中只能使用 'utf-8' 這個(gè)字串,其他情況會(huì)報(bào)錯(cuò)。
【舉例】
1. Python 解析器說(shuō)明 + Emacs 風(fēng)格的文件編碼注釋
#!/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. 無(wú) Python 解析器說(shuō)明 + 普通明文描述
# This Python file uses the following encoding: utf-8
import os, sys
...
3. Python 解析器說(shuō)明 + 非 Emacs 風(fēng)格的文件編碼注釋
#!/usr/local/bin/python
# coding: latin-1
import os, sys
...
4. 無(wú)編碼注釋(Python 解析器默認(rèn)為 ASCII)
#!/usr/local/bin/python
import os, sys
...
5. 錯(cuò)誤的編碼注釋方式
a. 無(wú) 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
...
=========== 我是分割線 ============
小實(shí)驗(yàn)截圖:
輸出中文。
報(bào)錯(cuò)。
添加編碼。
正常輸出。
IDE默認(rèn)的編碼設(shè)置。
各種轉(zhuǎn)碼輸出。
輸出的結(jié)果。
補(bǔ)充說(shuō)明:
cp936即 code page 936(代碼頁(yè)936)是以GBK(國(guó)標(biāo)擴(kuò)展字符集)為基礎(chǔ)的編碼。GB2312(國(guó)標(biāo)字符集)只是GBK的一部分。
GB2312只支持常用的漢字,而且是簡(jiǎn)體字。GBK支持繁體字和生僻字。
總結(jié)
以上是生活随笔為你收集整理的python源文件编码的含义_【原创】Python 源文件编码解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mqtt协议详解_阿里云物联网平台使用心
- 下一篇: LeetCode 671. 二叉树中第二