新聞中心
codecs —- 編解碼器注冊(cè)和相關(guān)基類
源代碼: Lib/codecs.py

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、萬(wàn)安網(wǎng)站維護(hù)、網(wǎng)站推廣。
這個(gè)模塊定義了標(biāo)準(zhǔn) python 編解碼器(編碼器和解碼器)的基類并提供對(duì)內(nèi)部 Python 編解碼器注冊(cè)表的訪問(wèn),該注冊(cè)表負(fù)責(zé)管理編解碼器和錯(cuò)誤處理的查找過(guò)程。 大多數(shù)標(biāo)準(zhǔn)編解碼器都屬于 文本編碼格式,它們可將文本編碼為字節(jié)串(以及將字節(jié)串解碼為文本),但也提供了一些將文本編碼為文本,以及將字節(jié)串編碼為字節(jié)串的編解碼器。 自定義編解碼器可以在任意類型間進(jìn)行編碼和解碼,但某些模塊特性被限制為僅適用于 文本編碼格式 或?qū)?shù)據(jù)編碼為 bytes 的編解碼器。
該模塊定義了以下用于使用任何編解碼器進(jìn)行編碼和解碼的函數(shù):
codecs.encode(obj, encoding=’utf-8’, errors=’strict’)
使用為 encoding 注冊(cè)的編解碼器對(duì) obj 進(jìn)行編碼。
可以給定 Errors 以設(shè)置所需要的錯(cuò)誤處理方案。 默認(rèn)的錯(cuò)誤處理方案 'strict' 表示編碼錯(cuò)誤將引發(fā) ValueError (或更特定編解碼器相關(guān)的子類,例如 UnicodeEncodeError)。 請(qǐng)參閱 編解碼器基類 了解有關(guān)編解碼器錯(cuò)誤處理的更多信息。
codecs.decode(obj, encoding=’utf-8’, errors=’strict’)
使用為 encoding 注冊(cè)的編解碼器對(duì) obj 進(jìn)行解碼。
可以給定 Errors 以設(shè)置所需要的錯(cuò)誤處理方案。 默認(rèn)的錯(cuò)誤處理方案 'strict' 表示編碼錯(cuò)誤將引發(fā) ValueError (或更特定編解碼器相關(guān)的子類,例如 UnicodeDecodeError)。 請(qǐng)參閱 編解碼器基類 了解有關(guān)編解碼器錯(cuò)誤處理的更多信息。
每種編解碼器的完整細(xì)節(jié)也可以直接查找獲?。?/p>
codecs.lookup(encoding)
在 Python 編解碼器注冊(cè)表中查找編解碼器信息,并返回一個(gè) CodecInfo 對(duì)象,其定義見(jiàn)下文。
首先將會(huì)在注冊(cè)表緩存中查找編碼,如果未找到,則會(huì)掃描注冊(cè)的搜索函數(shù)列表。 如果沒(méi)有找到 CodecInfo 對(duì)象,則將引發(fā) LookupError。 否則,CodecInfo 對(duì)象將被存入緩存并返回給調(diào)用者。
class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)
查找編解碼器注冊(cè)表所得到的編解碼器細(xì)節(jié)信息。 構(gòu)造器參數(shù)將保存為同名的屬性:
-
name
編碼名稱
-
encode
decode
無(wú)狀態(tài)的編碼和解碼函數(shù)。 它們必須是具有與 Codec 的 encode() 和 decode() 方法相同接口的函數(shù)或方法 (參見(jiàn) Codec 接口)。 這些函數(shù)或方法應(yīng)當(dāng)工作于無(wú)狀態(tài)的模式。
-
incrementalencoder
incrementaldecoder
增量式的編碼器和解碼器類或工廠函數(shù)。 這些函數(shù)必須分別提供由基類 IncrementalEncoder 和 IncrementalDecoder 所定義的接口。 增量式編解碼器可以保持狀態(tài)。
-
streamwriter
streamreader
流式寫入器和讀取器類或工廠函數(shù)。 這些函數(shù)必須分別提供由基類 StreamWriter 和 StreamReader 所定義的接口。 流式編解碼器可以保持狀態(tài)。
為了簡(jiǎn)化對(duì)各種編解碼器組件的訪問(wèn),本模塊提供了以下附加函數(shù),它們使用 lookup() 來(lái)執(zhí)行編解碼器查找:
codecs.getencoder(encoding)
查找給定編碼的編解碼器并返回其編碼器函數(shù)。
在編碼無(wú)法找到時(shí)將引發(fā) LookupError。
codecs.getdecoder(encoding)
查找給定編碼的編解碼器并返回其解碼器函數(shù)。
在編碼無(wú)法找到時(shí)將引發(fā) LookupError。
codecs.getincrementalencoder(encoding)
查找給定編碼的編解碼器并返回其增量式編碼器類或工廠函數(shù)。
在編碼無(wú)法找到或編解碼器不支持增量式編碼器時(shí)將引發(fā) LookupError。
codecs.getincrementaldecoder(encoding)
查找給定編碼的編解碼器并返回其增量式解碼器類或工廠函數(shù)。
在編碼無(wú)法找到或編解碼器不支持增量式解碼器時(shí)將引發(fā) LookupError。
codecs.getreader(encoding)
查找給定編碼的編解碼器并返回其 StreamReader 類或工廠函數(shù)。
在編碼無(wú)法找到時(shí)將引發(fā) LookupError。
codecs.getwriter(encoding)
查找給定編碼的編解碼器并返回其 StreamWriter 類或工廠函數(shù)。
在編碼無(wú)法找到時(shí)將引發(fā) LookupError。
自定義編解碼器的啟用是通過(guò)注冊(cè)適當(dāng)?shù)木幗獯a器搜索函數(shù):
codecs.register(search_function)
注冊(cè)一個(gè)編解碼器搜索函數(shù)。 搜索函數(shù)預(yù)期接收一個(gè)參數(shù),即全部以小寫字母表示的編碼格式名稱,其中中連字符和空格會(huì)被轉(zhuǎn)換為下劃線,并返回一個(gè) CodecInfo 對(duì)象。 在搜索函數(shù)無(wú)法找到給定編碼格式的情況下,它應(yīng)當(dāng)返回 None。
在 3.9 版更改: 連字符和空格會(huì)被轉(zhuǎn)換為下劃線。
codecs.unregister(search_function)
注銷一個(gè)編解碼器搜索函數(shù)并清空注冊(cè)表緩存。 如果指定搜索函數(shù)未被注冊(cè),則不做任何操作。
3.10 新版功能.
雖然內(nèi)置的 open() 和相關(guān)聯(lián)的 io 模塊是操作已編碼文本文件的推薦方式,但本模塊也提供了額外的工具函數(shù)和類,允許在操作二進(jìn)制文件時(shí)使用更多各類的編解碼器:
codecs.open(filename, mode=’r’, encoding=None, errors=’strict’, buffering=- 1)
使用給定的 mode 打開(kāi)已編碼的文件并返回一個(gè) StreamReaderWriter 的實(shí)例,提供透明的編碼/解碼。 默認(rèn)的文件模式為 'r',表示以讀取模式打開(kāi)文件。
備注
If encoding is not None, then the underlying encoded files are always opened in binary mode. No automatic conversion of '\n' is done on reading and writing. The mode argument may be any binary mode acceptable to the built-in open() function; the 'b' is automatically added.
encoding 指定文件所要使用的編碼格式。 允許任何編碼為字節(jié)串或從字節(jié)串解碼的編碼格式,而文件方法所支持的數(shù)據(jù)類型則取決于所使用的編解碼器。
可以指定 errors 來(lái)定義錯(cuò)誤處理方案。 默認(rèn)值 'strict' 表示在出現(xiàn)編碼錯(cuò)誤時(shí)引發(fā) ValueError。
buffering 的含義與內(nèi)置 open() 函數(shù)中的相同。 默認(rèn)值 -1 表示將使用默認(rèn)的緩沖區(qū)大小。
在 3.11 版更改: The 'U' mode has been removed.
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors=’strict’)
返回一個(gè) StreamRecoder 實(shí)例,它提供了 file 的透明轉(zhuǎn)碼包裝版本。 當(dāng)包裝版本被關(guān)閉時(shí)原始文件也會(huì)被關(guān)閉。
寫入已包裝文件的數(shù)據(jù)會(huì)根據(jù)給定的 data_encoding 解碼,然后以使用 file_encoding 的字節(jié)形式寫入原始文件。 從原始文件讀取的字節(jié)串將根據(jù) file_encoding 解碼,其結(jié)果將使用 data_encoding 進(jìn)行編碼。
如果 file_encoding 未給定,則默認(rèn)為 data_encoding。
可以指定 errors 來(lái)定義錯(cuò)誤處理方案。 默認(rèn)值 'strict' 表示在出現(xiàn)編碼錯(cuò)誤時(shí)引發(fā) ValueError。
codecs.iterencode(iterator, encoding, errors=’strict’, \*kwargs*)
使用增量式編碼器通過(guò)迭代來(lái)編碼由 iterator 所提供的輸入。 此函數(shù)屬于 generator。 errors 參數(shù)(以及任何其他關(guān)鍵字參數(shù))會(huì)被傳遞給增量式編碼器。
此函數(shù)要求編解碼器接受 str 對(duì)象形式的文本進(jìn)行編碼。 因此它不支持字節(jié)到字節(jié)的編碼器,例如 base64_codec。
codecs.iterdecode(iterator, encoding, errors=’strict’, \*kwargs*)
使用增量式解碼器通過(guò)迭代來(lái)解碼由 iterator 所提供的輸入。 此函數(shù)屬于 generator。 errors 參數(shù)(以及任何其他關(guān)鍵字參數(shù))會(huì)被傳遞給增量式解碼器。
此函數(shù)要求編解碼器接受 bytes 對(duì)象進(jìn)行解碼。 因此它不支持文本到文本的編碼器,例如 rot_13,但是 rot_13 可以通過(guò)同樣效果的 iterencode() 來(lái)使用。
本模塊還提供了以下常量,適用于讀取和寫入依賴于平臺(tái)的文件:
codecs.BOM
codecs.BOM_BE
codecs.BOM_LE
codecs.BOM_UTF8
codecs.BOM_UTF16
codecs.BOM_UTF16_BE
codecs.BOM_UTF16_LE
codecs.BOM_UTF32
codecs.BOM_UTF32_BE
codecs.BOM_UTF32_LE
這些常量定義了多種字節(jié)序列,即一些編碼格式的 Unicode 字節(jié)順序標(biāo)記(BOM)。 它們?cè)?UTF-16 和 UTF-32 數(shù)據(jù)流中被用以指明所使用的字節(jié)順序,并在 UTF-8 中被用作 Unicode 簽名。 BOM_UTF16 是 BOM_UTF16_BE 或 BOM_UTF16_LE,具體取決于平臺(tái)的本機(jī)字節(jié)順序,BOM 是 BOM_UTF16 的別名, BOM_LE 是 BOM_UTF16_LE 的別名,BOM_BE 是 BOM_UTF16_BE 的別名。 其他序列則表示 UTF-8 和 UTF-32 編碼格式中的 BOM。
編解碼器基類
codecs 模塊定義了一系列基類用來(lái)定義配合編解碼器對(duì)象進(jìn)行工作的接口,并且也可用作定制編解碼器實(shí)現(xiàn)的基礎(chǔ)。
每種編解碼器必須定義四個(gè)接口以便用作 Python 中的編解碼器:無(wú)狀態(tài)編碼器、無(wú)狀態(tài)解碼器、流讀取器和流寫入器。 流讀取器和寫入器通常會(huì)重用無(wú)狀態(tài)編碼器/解碼器來(lái)實(shí)現(xiàn)文件協(xié)議。 編解碼器作者還需要定義編解碼器將如何處理編碼和解碼錯(cuò)誤。
錯(cuò)誤處理方案
為了簡(jiǎn)化和標(biāo)準(zhǔn)化錯(cuò)誤處理,編解碼器可以通過(guò)接受 errors 字符串參數(shù)來(lái)實(shí)現(xiàn)不同的錯(cuò)誤處理方案:
>>> 'German ?, '.encode(encoding='ascii', errors='backslashreplace')b'German \\xdf, \\u266c'>>> 'German ?, '.encode(encoding='ascii', errors='xmlcharrefreplace')b'German ß, ♬'
以下錯(cuò)誤處理句柄可以用于所有的 Python 標(biāo)準(zhǔn)編碼 編解碼器:
|
值 |
含意 |
|---|---|
|
引發(fā) UnicodeError (或其子類),這是默認(rèn)的方案。 在 strict_errors() 中實(shí)現(xiàn)。 |
|
忽略錯(cuò)誤格式的數(shù)據(jù)并且不加進(jìn)一步通知就繼續(xù)執(zhí)行。 在 ignore_errors() 中實(shí)現(xiàn)。 |
|
用一個(gè)替代標(biāo)記來(lái)替換。 在編碼時(shí),使用 |
|
用反斜杠轉(zhuǎn)義序列來(lái)替換。 在編碼時(shí),使用格式為 |
|
在解碼時(shí),將字節(jié)替換為 |
下列錯(cuò)誤處理句柄僅在編碼時(shí)適用(在 文本編碼格式 類別以內(nèi)):
|
值 |
含意 |
|---|---|
|
用 XML/HTML 數(shù)字字符引用來(lái)替換,即格式為 |
|
用 |
此外,以下錯(cuò)誤處理方案被專門用于指定的編解碼器:
|
值 |
編解碼器 |
含意 |
|---|---|---|
|
utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le |
允許將代理碼位 ( |
3.1 新版功能: 'surrogateescape' 和 'surrogatepass' 錯(cuò)誤處理方案。
在 3.4 版更改: 'surrogatepass' 錯(cuò)誤處理器現(xiàn)在可適用于 utf-16* 和 utf-32* 編解碼器。
3.5 新版功能: 'namereplace' 錯(cuò)誤處理方案。
在 3.5 版更改: 'backslashreplace' 錯(cuò)誤處理器現(xiàn)在可適用于解碼和轉(zhuǎn)碼。
允許的值集合可以通過(guò)注冊(cè)新命名的錯(cuò)誤處理方案來(lái)擴(kuò)展:
codecs.register_error(name, error_handler)
在名稱 name 之下注冊(cè)錯(cuò)誤處理函數(shù) error_handler。 當(dāng) name 被指定為錯(cuò)誤形參時(shí),error_handler 參數(shù)所指定的對(duì)象將在編碼和解碼期間發(fā)生錯(cuò)誤的情況下被調(diào)用,
對(duì)于編碼操作,將會(huì)調(diào)用 error_handler 并傳入一個(gè) UnicodeEncodeError 實(shí)例,其中包含有關(guān)錯(cuò)誤位置的信息。 錯(cuò)誤處理程序必須引發(fā)此異?;騽e的異常,或者也可以返回一個(gè)元組,其中包含輸入的不可編碼部分的替換對(duì)象,以及應(yīng)當(dāng)繼續(xù)進(jìn)行編碼的位置。 替換對(duì)象可以為 str 或 bytes 類型。 如果替換對(duì)象為字節(jié)串,編碼器將簡(jiǎn)單地將其復(fù)制到輸出緩沖區(qū)。 如果替換對(duì)象為字符串,編碼器將對(duì)替換對(duì)象進(jìn)行編碼。 對(duì)原始輸入的編碼操作會(huì)在指定位置繼續(xù)進(jìn)行。 負(fù)的位置值將被視為相對(duì)于輸入字符串的末尾。 如果結(jié)果位置超出范圍則將引發(fā) IndexError。
解碼和轉(zhuǎn)換的做法很相似,不同之處在于將把 UnicodeDecodeError 或 UnicodeTranslateError 傳給處理程序,并且來(lái)自錯(cuò)誤處理程序的替換對(duì)象將被直接放入輸出。
之前注冊(cè)的錯(cuò)誤處理方案(包括標(biāo)準(zhǔn)錯(cuò)誤處理方案)可通過(guò)名稱進(jìn)行查找:
codecs.lookup_error(name)
返回之前在名稱 name 之下注冊(cè)的錯(cuò)誤處理方案。
在處理方案無(wú)法找到時(shí)將引發(fā) LookupError。
以下標(biāo)準(zhǔn)錯(cuò)誤處理方案也可通過(guò)模塊層級(jí)函數(shù)的方式來(lái)使用:
codecs.strict_errors(exception)
實(shí)現(xiàn)了 'strict' 錯(cuò)誤處理。
每個(gè)編碼或解碼錯(cuò)誤都將引發(fā) UnicodeError。
codecs.ignore_errors(exception)
實(shí)現(xiàn)了 'ignore' 錯(cuò)誤處理。
錯(cuò)誤格式的數(shù)據(jù)會(huì)被忽略;編碼或解碼將繼續(xù)執(zhí)行而不再通知。
codecs.replace_errors(exception)
實(shí)現(xiàn)了 'replace' 錯(cuò)誤處理。
替換 ? (ASCII 字符) 表示編碼錯(cuò)誤或者 ? (U+FFFD,官方的 REPLACEMENT CHARACTER) 表示解碼錯(cuò)誤。
codecs.backslashreplace_errors(exception)
實(shí)現(xiàn)了 'backslashreplace' 錯(cuò)誤處理。
錯(cuò)誤格式的數(shù)據(jù)會(huì)用反斜杠轉(zhuǎn)義序列來(lái)替換。 在編碼時(shí),使用格式為 \xhh \uxxxx \Uxxxxxxxx 的 Unicode 碼位十六進(jìn)制表示形式。 在解碼時(shí),使用格式為 \xhh 的字節(jié)值十六進(jìn)制表示形式。
在 3.5 版更改: 適用于解碼和轉(zhuǎn)碼。
codecs.xmlcharrefreplace_errors(exception)
實(shí)現(xiàn) 'xmlcharrefreplace' 錯(cuò)誤處理(僅限 text encoding 范圍內(nèi)的編碼操作)。
不可編碼的字符會(huì)被替換為適當(dāng)?shù)?XML/HTML 數(shù)值字符引用,即格式為 num; 的十進(jìn)制形式 Unicode 碼位。
codecs.namereplace_errors(exception)
實(shí)現(xiàn) 'namereplace' 錯(cuò)誤處理(僅限 text encoding 范圍內(nèi)的編碼操作)。
不可編碼的字符會(huì)被替換為 \N{...} 轉(zhuǎn)義序列。 出現(xiàn)在花括號(hào)內(nèi)的字符集合是來(lái)自于 Unicode 字符數(shù)據(jù)庫(kù)的 Name 屬性。 例如,德語(yǔ)小寫字母 '?' 將被轉(zhuǎn)換為字符序列 \N{LATIN SMALL LETTER SHARP S}。
3.5 新版功能.
無(wú)狀態(tài)的編碼和解碼
基本 Codec 類定義了這些方法,同時(shí)還定義了無(wú)狀態(tài)編碼器和解碼器的函數(shù)接口:
Codec.encode(input, errors=’strict’)
編碼 input 對(duì)象并返回一個(gè)元組 (輸出對(duì)象, 消耗長(zhǎng)度)。 例如,text encoding 會(huì)使用特定的字符集編碼格式 (例如 cp1252 或 iso-8859-1) 將字符串轉(zhuǎn)換為字節(jié)串對(duì)象。
errors 參數(shù)定義了要應(yīng)用的錯(cuò)誤處理方案。 默認(rèn)為 'strict' 處理方案。
此方法不一定會(huì)在 Codec 實(shí)例中保存狀態(tài)。 可使用必須保存狀態(tài)的 StreamWriter 作為編解碼器以便高效地進(jìn)行編碼。
編碼器必須能夠處理零長(zhǎng)度的輸入并在此情況下返回輸出對(duì)象類型的空對(duì)象。
Codec.decode(input, errors=’strict’)
解碼 input 對(duì)象并返回一個(gè)元組 (輸出對(duì)象, 消耗長(zhǎng)度)。 例如,text encoding 的解碼操作會(huì)使用特定的字符集編碼格式將字節(jié)串對(duì)象轉(zhuǎn)換為字符串對(duì)象。
對(duì)于文本編碼格式和字節(jié)到字節(jié)編解碼器,input 必須為一個(gè)字節(jié)串對(duì)象或提供了只讀緩沖區(qū)接口的對(duì)象 — 例如,緩沖區(qū)對(duì)象和映射到內(nèi)存的文件。
errors 參數(shù)定義了要應(yīng)用的錯(cuò)誤處理方案。 默認(rèn)為 'strict' 處理方案。
此方法不一定會(huì)在 Codec 實(shí)例中保存狀態(tài)。 可使用必須保存狀態(tài)的 StreamReader 作為編解碼器以便高效地進(jìn)行解碼。
解碼器必須能夠處理零長(zhǎng)度的輸入并在此情況下返回輸出對(duì)象類型的空對(duì)象。
增量式的編碼和解碼
IncrementalEncoder 和 IncrementalDecoder 類提供了增量式編碼和解碼的基本接口。 對(duì)輸入的編碼/解碼不是通過(guò)對(duì)無(wú)狀態(tài)編碼器/解碼器的一次調(diào)用,而是通過(guò)對(duì)增量式編碼器/解碼器的 encode()/decode() 方法的多次調(diào)用。 增量式編碼器/解碼器會(huì)在方法調(diào)用期間跟蹤編碼/解碼過(guò)程。
調(diào)用 encode()/decode() 方法后的全部輸出相當(dāng)于將所有通過(guò)無(wú)狀態(tài)編碼器/解碼器進(jìn)行編碼/解碼的單個(gè)輸入連接在一起所得到的輸出。
IncrementalEncoder 對(duì)象
IncrementalEncoder 類用來(lái)對(duì)一個(gè)輸入進(jìn)行分步編碼。 它定義了以下方法,每個(gè)增量式編碼器都必須定義這些方法以便與 Python 編解碼器注冊(cè)表相兼容。
class codecs.IncrementalEncoder(errors=’strict’)
IncrementalEncoder 實(shí)例的構(gòu)造器。
所有增量式編碼器必須提供此構(gòu)造器接口。 它們可以自由地添加額外的關(guān)鍵字參數(shù),但只有在這里定義的參數(shù)才會(huì)被 Python 編解碼器注冊(cè)表所使用。
IncrementalEncoder 可以通過(guò)提供 errors 關(guān)鍵字參數(shù)來(lái)實(shí)現(xiàn)不同的錯(cuò)誤處理方案。 可用的值請(qǐng)參閱 錯(cuò)誤處理方案。
errors 參數(shù)將被賦值給一個(gè)同名的屬性。 通過(guò)對(duì)此屬性賦值就可以在 IncrementalEncoder 對(duì)象的生命期內(nèi)在不同的錯(cuò)誤處理策略之間進(jìn)行切換。
-
encode(object, final=False)
編碼 object (會(huì)將編碼器的當(dāng)前狀態(tài)納入考慮) 并返回已編碼的結(jié)果對(duì)象。 如果這是對(duì) encode() 的最終調(diào)用則 final 必須為真值(默認(rèn)為假值)。
-
reset()
將編碼器重置為初始狀態(tài)。 輸出將被丟棄:調(diào)用
.encode(object, final=True),在必要時(shí)傳入一個(gè)空字節(jié)串或字符串,重置編碼器并得到輸出。 -
getstate()
返回編碼器的當(dāng)前狀態(tài),該值必須為一個(gè)整數(shù)。 實(shí)現(xiàn)應(yīng)當(dāng)確保
0是最常見(jiàn)的狀態(tài)。 (比整數(shù)更復(fù)雜的狀態(tài)表示可以通過(guò)編組/選擇狀態(tài)并將結(jié)果字符串的字節(jié)數(shù)據(jù)編碼為整數(shù)來(lái)轉(zhuǎn)換為一個(gè)整數(shù)值)。 -
setstate(state)
將編碼器的狀態(tài)設(shè)為 state。 state 必須為 getstate() 所返回的一個(gè)編碼器狀態(tài)。
IncrementalDecoder 對(duì)象
IncrementalDecoder 類用來(lái)對(duì)一個(gè)輸入進(jìn)行分步解碼。 它定義了以下方法,每個(gè)增量式解碼器都必須定義這些方法以便與 Python 編解碼器注冊(cè)表相兼容。
class codecs.IncrementalDecoder(errors=’strict’)
IncrementalDecoder 實(shí)例的構(gòu)造器。
所有增量式解碼器必須提供此構(gòu)造器接口。 它們可以自由地添加額外的關(guān)鍵字參數(shù),但只有在這里定義的參數(shù)才會(huì)被 Python 編解碼器注冊(cè)表所使用。
IncrementalDecoder 可以通過(guò)提供 errors 關(guān)鍵字參數(shù)來(lái)實(shí)現(xiàn)不同的錯(cuò)誤處理方案。 可用的值請(qǐng)參閱 錯(cuò)誤處理方案。
errors 參數(shù)將被賦值給一個(gè)同名的屬性。 通過(guò)對(duì)此屬性賦值就可以在 IncrementalDecoder 對(duì)象的生命期內(nèi)在不同的錯(cuò)誤處理策略之間進(jìn)行切換。
-
decode(object, final=False)
解碼 object (會(huì)將解碼器的當(dāng)前狀態(tài)納入考慮) 并返回已解碼的結(jié)果對(duì)象。 如果這是對(duì) decode() 的最終調(diào)用則 final 必須為真值(默認(rèn)為假值)。 如果 final 為真值則解碼器必須對(duì)輸入進(jìn)行完全解碼并且必須 刷新所有緩沖區(qū)。 如果這無(wú)法做到(例如由于在輸入結(jié)束時(shí)字節(jié)串序列不完整)則它必須像在無(wú)狀態(tài)的情況下那樣初始化錯(cuò)誤處理(這可能引發(fā)一個(gè)異常)。
-
reset()
將解碼器重置為初始狀態(tài)。
-
getstate()
返回解碼器的當(dāng)前狀態(tài)。 這必須為一個(gè)二元組,第一項(xiàng)必須是包含尚未解碼的輸入的緩沖區(qū)。 第二項(xiàng)必須為一個(gè)整數(shù),可以表示附加狀態(tài)信息。 (實(shí)現(xiàn)應(yīng)當(dāng)確保
0是最常見(jiàn)的附加狀態(tài)信息。) 如果此附加狀態(tài)信息為0則必須可以將解碼器設(shè)為沒(méi)有已緩沖輸入并且以0作為附加狀態(tài)信息,以便將先前已緩沖的輸入饋送到解碼器使其返回到先前的狀態(tài)而不產(chǎn)生任何輸出。 (比整數(shù)更復(fù)雜的附加狀態(tài)信息可以通過(guò)編組/選擇狀態(tài)信息并將結(jié)果字符串的字節(jié)數(shù)據(jù)編碼為整數(shù)來(lái)轉(zhuǎn)換為一個(gè)整數(shù)值。) -
setstate(state)
將解碼器的狀態(tài)設(shè)為 state。 state 必須為 getstate() 所返回的一個(gè)解碼器狀態(tài)。
流式的編碼和解碼
StreamWriter 和 StreamReader 類提供了一些泛用工作接口,可被用來(lái)非常方便地實(shí)現(xiàn)新的編碼格式子模塊。 請(qǐng)參閱 encodings.utf_8 中的示例了解如何做到這一點(diǎn)。
StreamWriter 對(duì)象
StreamWriter 類是 Codec 的子類,它定義了以下方法,每個(gè)流式寫入器都必須定義這些方法以便與 Python 編解碼器注冊(cè)表相兼容。
class codecs.StreamWriter(stream, errors=’strict’)
StreamWriter 實(shí)例的構(gòu)造器。
所有流式寫入器必須提供此構(gòu)造器接口。 它們可以自由地添加額外的關(guān)鍵字參數(shù),但只有在這里定義的參數(shù)才會(huì)被 Python 編解碼器注冊(cè)表所使用。
stream 參數(shù)必須為一個(gè)基于特定編解碼器打開(kāi)用于寫入文本或二進(jìn)制數(shù)據(jù)的文件類對(duì)象。
StreamWriter 可以通過(guò)提供 errors 關(guān)鍵字參數(shù)來(lái)實(shí)現(xiàn)不同的錯(cuò)誤處理方案。 請(qǐng)參閱 錯(cuò)誤處理方案 了解下層的流式編解碼器可支持的標(biāo)準(zhǔn)錯(cuò)誤處理方案。
errors 參數(shù)將被賦值給一個(gè)同名的屬性。 通過(guò)對(duì)此屬性賦值就可以在 StreamWriter 對(duì)象的生命期內(nèi)在不同的錯(cuò)誤處理策略之間進(jìn)行切換。
-
write(object)
將編碼后的對(duì)象內(nèi)容寫入到流。
-
writelines(list)
將拼接后的字符串可迭代對(duì)象寫入到流(可能通過(guò)重用 write() 方法)。 無(wú)限長(zhǎng)或非常大的可迭代對(duì)象不受支持。 標(biāo)準(zhǔn)的字節(jié)到字節(jié)編解碼器不支持此方法。
-
reset()
重置用于保持內(nèi)部狀態(tài)的編解碼器緩沖區(qū)。
調(diào)用此方法應(yīng)當(dāng)確保在干凈的狀態(tài)下放入輸出數(shù)據(jù),以允許直接添加新的干凈數(shù)據(jù)而無(wú)須重新掃描整個(gè)流來(lái)恢復(fù)狀態(tài)。
除了上述的方法,StreamWriter 還必須繼承來(lái)自下層流的所有其他方法和屬性。
StreamReader 對(duì)象
StreamReader 類是 Codec 的子類,它定義了以下方法,每個(gè)流式讀取器都必須定義這些方法以便與 Python 編解碼器注冊(cè)表相兼容。
class codecs.StreamReader(stream, errors=’strict’)
StreamReader 實(shí)例的構(gòu)造器。
所有流式讀取器必須提供此構(gòu)造器接口。 它們可以自由地添加額外的關(guān)鍵字參數(shù),但只有在這里定義的參數(shù)才會(huì)被 Python 編解碼器注冊(cè)表所使用。
stream 參數(shù)必須為一個(gè)基于特定編解碼器打開(kāi)用于讀取文本或二進(jìn)制數(shù)據(jù)的文件類對(duì)象。
StreamReader 可以通過(guò)提供 errors 關(guān)鍵字參數(shù)來(lái)實(shí)現(xiàn)不同的錯(cuò)誤處理方案。 請(qǐng)參閱 錯(cuò)誤處理方案 了解下層的流式編解碼器可支持的標(biāo)準(zhǔn)錯(cuò)誤處理方案。
errors 參數(shù)將被賦值給一個(gè)同名的屬性。 通過(guò)對(duì)此屬性賦值就可以在 StreamReader 對(duì)象的生命期內(nèi)在不同的錯(cuò)誤處理策略之間進(jìn)行切換。
errors 參數(shù)所允許的值集合可以使用 register_error() 來(lái)擴(kuò)展。
-
read(size=- 1, chars=- 1, firstline=False)
解碼來(lái)自流的數(shù)據(jù)并返回結(jié)果對(duì)象。
chars 參數(shù)指明要返回的解碼后碼位或字節(jié)數(shù)量。 read() 方法絕不會(huì)返回超出請(qǐng)求數(shù)量的數(shù)據(jù),但如果可用數(shù)量不足,它可能返回少于請(qǐng)求數(shù)量的數(shù)據(jù)。
size 參數(shù)指明要讀取并解碼的已編碼字節(jié)或碼位的最大數(shù)量近似值。 解碼器可以適當(dāng)?shù)匦薷拇嗽O(shè)置。 默認(rèn)值 -1 表示盡可能多地讀取并解碼。 此形參的目的是防止一次性解碼過(guò)于巨大的文件。
firstline 旗標(biāo)指明如果在后續(xù)行發(fā)生解碼錯(cuò)誤,則僅返回第一行就足夠了。
此方法應(yīng)當(dāng)使用“貪婪”讀取策略,這意味著它應(yīng)當(dāng)在編碼格式定義和給定大小所允許的情況下盡可能多地讀取數(shù)據(jù),例如,如果在流上存在可選的編碼結(jié)束或狀態(tài)標(biāo)記,這些內(nèi)容也應(yīng)當(dāng)被讀取。
-
readline(size=None, keepends=True)
從輸入流讀取一行并返回解碼后的數(shù)據(jù)。
如果給定了 size,則將其作為 size 參數(shù)傳遞給流的 read() 方法。
如果 keepends 為假值,則行結(jié)束符將從返回的行中去除。
-
readlines(sizehint=None, keepends=True)
從輸入流讀取所有行并將其作為一個(gè)行列表返回。
行結(jié)束符會(huì)使用編解碼器的 decode() 方法來(lái)實(shí)現(xiàn),并且如果 keepends 為真值則會(huì)將其包含在列表?xiàng)l目中。
如果給定了 sizehint,則將其作為 size 參數(shù)傳遞給流的 read() 方法。
-
reset()
重置用于保持內(nèi)部狀態(tài)的編解碼器緩沖區(qū)。
請(qǐng)注意不應(yīng)當(dāng)對(duì)流進(jìn)行重定位。 使用此方法的主要目的是為了能夠從解碼錯(cuò)誤中恢復(fù)。
除了上述的方法,StreamReader 還必須繼承來(lái)自下層流的所有其他方法和屬性。
StreamReaderWriter 對(duì)象
StreamReaderWriter 是一個(gè)方便的類,允許對(duì)同時(shí)工作于讀取和寫入模式的流進(jìn)行包裝。
其設(shè)計(jì)使得開(kāi)發(fā)者可以使用 lookup() 函數(shù)所返回的工廠函數(shù)來(lái)構(gòu)造實(shí)例。
class codecs.StreamReaderWriter(stream, Reader, Writer, errors=’strict’)
創(chuàng)建一個(gè) StreamReaderWriter 實(shí)例。 stream 必須為一個(gè)文件類對(duì)象。 Reader 和 Writer 必須為分別提供了 StreamReader 和 StreamWriter 接口的工廠函數(shù)或類。 錯(cuò)誤處理通過(guò)與流式讀取器和寫入器所定義的相同方式來(lái)完成。
StreamReaderWriter 實(shí)例定義了 StreamReader 和 StreamWriter 類的組合接口。 它們還繼承了來(lái)自下層流的所有其他方法和屬性。
StreamRecoder 對(duì)象
StreamRecoder 將數(shù)據(jù)從一種編碼格式轉(zhuǎn)換為另一種,這對(duì)于處理不同編碼環(huán)境的情況有時(shí)會(huì)很有用。
其設(shè)計(jì)使得開(kāi)發(fā)者可以使用 lookup() 函數(shù)所返回的工廠函數(shù)來(lái)構(gòu)造實(shí)例。
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors=’strict’)
創(chuàng)建一個(gè)實(shí)現(xiàn)了雙向轉(zhuǎn)換的 StreamRecoder 實(shí)例: encode 和 decode 工作于前端 — 對(duì)代碼可見(jiàn)的數(shù)據(jù)調(diào)用 read() 和 write(),而 Reader 和 Writer 工作于后端 — stream 中的數(shù)據(jù)。
你可以使用這些對(duì)象來(lái)進(jìn)行透明轉(zhuǎn)碼,例如從 Latin-1 轉(zhuǎn)為 UTF-8 以及反向轉(zhuǎn)換。
stream 參數(shù)必須為一個(gè)文件類對(duì)象。
encode 和 decode 參數(shù)必須遵循 Codec 接口。 Reader 和 Writer 必須為分別提供了 StreamReader 和 StreamWriter 接口對(duì)象的工廠函數(shù)或類。
錯(cuò)誤處理通過(guò)與流式讀取器和寫入器所定義的相同方式來(lái)完成。
StreamRecoder 實(shí)例定義了 StreamReader 和 StreamWriter 類的組合接口。 它們還繼承了來(lái)自下層流的所有其他方法和屬性。
編碼格式與 Unicode
字符串在系統(tǒng)內(nèi)部存儲(chǔ)為 U+0000--U+10FFFF 范圍內(nèi)的碼位序列。 (請(qǐng)參閱 PEP 393 了解有關(guān)實(shí)現(xiàn)的詳情。) 一旦字符串對(duì)象要在 CPU 和內(nèi)存以外使用,字節(jié)的大小端順序和字節(jié)數(shù)組的存儲(chǔ)方式就成為一個(gè)影響因素。 如同使用其他編解碼器一樣,將字符串序列化為字節(jié)序列被稱為 編碼,而從字節(jié)序列重建字符串被稱為 解碼。 存在許多不同的文本序列化編解碼器,它們被統(tǒng)稱為 文本編碼格式。
最簡(jiǎn)單的文本編碼格式 (稱為 'latin-1' 或 'iso-8859-1') 將碼位 0—255 映射為字節(jié)值 0x0--0xff,這意味著包含 U+00FF 以上碼位的字符串對(duì)象無(wú)法使用此編解碼器進(jìn)行編碼。 這樣做將引發(fā) UnicodeEncodeError,其形式類似下面這樣(不過(guò)詳細(xì)的錯(cuò)誤信息可能會(huì)有所不同): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256)。
還有另外一組編碼格式(所謂的字符映射編碼)會(huì)選擇全部 Unicode 碼位的不同子集并設(shè)定如何將這些碼位映射為字節(jié)值 0x0--0xff。 要查看這是如何實(shí)現(xiàn)的,只需簡(jiǎn)單地打開(kāi)相應(yīng)源碼例如 encodings/cp1252.py (這是一個(gè)主要在 Windows 上使用的編碼格式)。 其中會(huì)有一個(gè)包含 256 個(gè)字符的字符串常量,指明每個(gè)字符所映射的字節(jié)值。
所有這些編碼格式只能對(duì) Unicode 所定義的 1114112 個(gè)碼位中的 256 個(gè)進(jìn)行編碼。 一種能夠存儲(chǔ)每個(gè) Unicode 碼位的簡(jiǎn)單而直接的辦法就是將每個(gè)友們存儲(chǔ)為四個(gè)連續(xù)的字節(jié)。 存在兩種不同的可能性:以大端序存儲(chǔ)或以小端序存儲(chǔ)。 這兩種編碼格式分別被稱為 UTF-32-BE 和 UTF-32-LE。 他們共有的缺點(diǎn)可以舉例說(shuō)明:如果你在一臺(tái)小端序的機(jī)器上使用 UTF-32-BE 則你必須在編碼和解碼時(shí)翻轉(zhuǎn)字節(jié)。 UTF-32 避免了這個(gè)問(wèn)題:字節(jié)的排列將總是使用自然端序。 當(dāng)這些字節(jié)被具有不同端序的 CPU 讀取時(shí),則必須進(jìn)行字節(jié)翻轉(zhuǎn)。 為了能夠檢測(cè) UTF-16 或 UTF-32 字節(jié)序列的大小端序,可以使用所謂的 BOM (“字節(jié)順序標(biāo)記”)。 這對(duì)應(yīng)于 Unicode 字符 U+FEFF。 此字符可被添加到每個(gè) UTF-16 或 UTF-32 字節(jié)序列的開(kāi)頭。 此字符的字節(jié)翻轉(zhuǎn)版本 (0xFFFE) 是一個(gè)不可出現(xiàn)于 Unicode 文本中的非法字符。 因此當(dāng)發(fā)現(xiàn)一個(gè) UTF-16 或 UTF-32 字節(jié)序列的首個(gè)字符是 U+FFFE 時(shí),就必須在解碼時(shí)進(jìn)行字節(jié)翻轉(zhuǎn)。 不幸的是字符 U+FEFF 還有第二個(gè)含義 ZERO WIDTH NO-BREAK SPACE: 即寬度為零并且不允許用來(lái)拆分單詞的字符。 它可以被用來(lái)為語(yǔ)言分析算法提供提示。 在 Unicode 4.0 中使用 U+FEFF 表示 ZERO WIDTH NO-BREAK SPACE 已被棄用 (改用 U+2060 (WORD JOINER) 負(fù)責(zé)此任務(wù))。 然而 Unicode 軟件仍然必須能夠處理 U+FEFF 的兩個(gè)含義:作為 BOM 它被用來(lái)確定已編碼字節(jié)的存儲(chǔ)布局,并在字節(jié)序列被解碼為字符串后將其去除;作為 ZERO WIDTH NO-BREAK SPACE 它是一個(gè)普通字符,將像其他字符一樣被解碼。
還有另一種編碼格式能夠?qū)λ?Unicode 字符進(jìn)行編碼:UTF-8。 UTF-8 是一種 8 位編碼,這意味著在 UTF-8 中沒(méi)有字節(jié)順序問(wèn)題。 UTF-8 字節(jié)序列中的每個(gè)字節(jié)由兩部分組成:標(biāo)志位(最重要的位)和內(nèi)容位。 標(biāo)志位是由零至四個(gè)值為 1 的二進(jìn)制位加一個(gè)值為 0 的二進(jìn)制位構(gòu)成的序列。 Unicode 字符會(huì)按以下形式進(jìn)行編碼(其中 x 為內(nèi)容位,當(dāng)拼接為一體時(shí)將給出對(duì)應(yīng)的 Unicode 字符):
|
范圍 |
編碼 |
|---|---|
|
0xxxxxxx |
|
110xxxxx 10xxxxxx |
|
1110xxxx 10xxxxxx 10xxxxxx |
|
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Unicode 字符最不重要的一個(gè)位就是最右側(cè)的二進(jìn)制位 x。
由于 UTF-8 是一種 8 位編碼格式,因此 BOM 是不必要的,并且已編碼字符串中的任何 U+FEFF 字符(即使是作為第一個(gè)字符)都會(huì)被視為是 ZERO WIDTH NO-BREAK SPACE。
在沒(méi)有外部信息的情況下將不可能毫無(wú)疑義地確定一個(gè)字符串使用了何種編碼格式。 每種字符映射編碼格式都可以解碼任意的隨機(jī)字節(jié)序列。 然而對(duì) UTF-8 來(lái)說(shuō)這卻是不可能的,因?yàn)?UTF-8 字節(jié)序列具有不允許任意字節(jié)序列的特別結(jié)構(gòu)。 為了提升 UTF-8 編碼格式檢測(cè)的可靠性,Microsoft 發(fā)明了一種 UTF-8 的變體形式 (Python 稱之為 "utf-8-sig") 專門用于其 Notepad 程序:在任何 Unicode 字節(jié)被寫入文件之前,會(huì)先寫入一個(gè) UTF-8 編碼的 BOM (它看起來(lái)是這樣一個(gè)字節(jié)序列: 0xef, 0xbb, 0xbf)。 由于任何字符映射編碼后的文件都不大可能以這些字節(jié)值開(kāi)頭 (例如它們會(huì)映射為
LATIN SMALL LETTER I WITH DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED QUESTION MARK
對(duì)于 iso-8859-1 編碼格式來(lái)說(shuō)),這提升了根據(jù)字節(jié)序列來(lái)正確猜測(cè) utf-8-sig 編碼格式的成功率。 所以在這里 BOM 的作用并不是幫助確定生成字節(jié)序列所使用的字節(jié)順序,而是作為幫助猜測(cè)編碼格式的記號(hào)。 在進(jìn)行編碼時(shí) utf-8-sig 編解碼器將把 0xef, 0xbb, 0xbf 作為頭三個(gè)字節(jié)寫入文件。 在進(jìn)行解碼時(shí) utf-8-sig 將跳過(guò)這三個(gè)字節(jié),如果它們作為文件的頭三個(gè)字節(jié)出現(xiàn)的話。 在 UTF-8 中并不推薦使用 BOM,通常應(yīng)當(dāng)避免它們的出現(xiàn)。
標(biāo)準(zhǔn)編碼
Python 自帶了許多內(nèi)置的編解碼器,它們的實(shí)現(xiàn)或者是通過(guò) C 函數(shù),或者是通過(guò)映射表。 以下表格是按名稱排序的編解碼器列表,并提供了一些常見(jiàn)別名以及編碼格式通常針對(duì)的語(yǔ)言。 別名和語(yǔ)言列表都不是詳盡無(wú)遺的。 請(qǐng)注意僅有大小寫區(qū)別或使用連字符替代下劃線的拼寫形式也都是有效的別名;因此,'utf-8' 是 'utf_8' 編解碼器的有效別名。
CPython 實(shí)現(xiàn)細(xì)節(jié): 有些常見(jiàn)編碼格式可以繞過(guò)編解碼器查找機(jī)制來(lái)提升性能。 這些優(yōu)化機(jī)會(huì)對(duì)于 CPython 來(lái)說(shuō)僅能通過(guò)一組有限的別名(大小寫不敏感)來(lái)識(shí)別:utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 專屬), ascii, us-ascii, utf-16, utf16, utf-32, utf32, 也包括使用下劃線替代連字符的的形式。 使用這些編碼格式的其他別名可能會(huì)導(dǎo)致更慢的執(zhí)行速度。
在 3.6 版更改: 可識(shí)別針對(duì) us-ascii 的優(yōu)化機(jī)會(huì)。
許多字符集都支持相同的語(yǔ)言。 它們?cè)趥€(gè)別字符(例如是否支持 EURO SIGN 等)以及給字符所分配的碼位方面存在差異。 特別是對(duì)于歐洲語(yǔ)言來(lái)說(shuō),通常存在以下幾種變體:
-
某個(gè) ISO 8859 編碼集
-
某個(gè) Microsoft Windows 編碼頁(yè),通常是派生自某個(gè) 8859 編碼集,但會(huì)用附加的圖形字符來(lái)替換控制字符。
-
某個(gè) IBM EBCDIC 編碼頁(yè)
-
某個(gè) IBM PC 編碼頁(yè),通常會(huì)兼容 ASCII
|
編碼 |
別名 |
語(yǔ)言 |
|---|---|---|
ascii |
646, us-ascii |
英語(yǔ) |
big5 |
big5-tw, csbig5 |
繁體中文 |
big5hkscs |
big5-hkscs, hkscs |
繁體中文 |
cp037 |
IBM037, IBM039 |
英語(yǔ) |
cp273 |
273, IBM273, csIBM273 |
德語(yǔ) 3.4 新版功能. |
cp424 |
EBCDIC-CP-HE, IBM424 |
希伯來(lái)語(yǔ) |
cp437 |
437, IBM437 |
英語(yǔ) |
cp500 |
EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 |
西歐 |
cp720 |
阿拉伯語(yǔ) | |
cp737 |
希臘語(yǔ) | |
cp775 |
IBM775 |
波羅的海語(yǔ)言 |
cp850 |
850, IBM850 |
西歐 |
cp852 |
852, IBM852 |
中歐和東歐 |
cp855 |
855, IBM855 |
保加利亞語(yǔ),白俄羅斯語(yǔ),馬其頓語(yǔ),俄語(yǔ),塞爾維亞語(yǔ) |
cp856 |
希伯來(lái)語(yǔ) | |
cp857 |
857, IBM857 |
土耳其語(yǔ) |
cp858 |
858, IBM858 |
西歐 |
cp860 |
860, IBM860 |
葡萄牙語(yǔ) |
cp861 |
861, CP-IS, IBM861 |
冰島語(yǔ) |
cp862 |
862, IBM862 |
希伯來(lái)語(yǔ) |
cp863 |
863, IBM863 |
加拿大語(yǔ) |
cp864 |
IBM864 |
阿拉伯語(yǔ) |
cp865 |
865, IBM865 |
丹麥語(yǔ)/挪威語(yǔ) |
cp866 |
866, IBM866 |
俄語(yǔ) |
cp869 |
869, CP-GR, IBM869 |
希臘語(yǔ) |
cp874 |
泰語(yǔ) | |
cp875 |
希臘語(yǔ) | |
cp932 |
932, ms932, mskanji, ms-kanji |
日語(yǔ) |
cp949 |
949, ms949, uhc |
韓語(yǔ) |
cp950 |
950, ms950 |
繁體中文 |
cp1006 |
烏爾都語(yǔ) | |
cp1026 |
ibm1026 |
土耳其語(yǔ) |
cp1125 |
1125, ibm1125, cp866u, ruscii |
烏克蘭語(yǔ) 3.4 新版功能. |
cp1140 |
ibm1140 |
西歐 |
cp1250 |
windows-1250 |
中歐和東歐 |
cp1251 |
windows-1251 |
保加利亞語(yǔ),白俄羅斯語(yǔ),馬其頓語(yǔ),俄語(yǔ),塞爾維亞語(yǔ) |
cp1252 |
windows-1252 |
西歐 |
cp1253 |
windows-1253 |
希臘語(yǔ) |
cp1254 |
windows-1254 |
土耳其語(yǔ) |
cp1255 |
windows-1255 |
希伯來(lái)語(yǔ) |
cp1256 |
windows-1256 |
阿拉伯語(yǔ) |
cp1257 |
windows-1257 |
波羅的海語(yǔ)言 |
cp1258 |
windows-1258 |
越南語(yǔ) |
euc_jp |
eucjp, ujis, u-jis |
日語(yǔ) |
euc_jis_2004 |
jisx0213, eucjis2004 |
日語(yǔ) |
euc_jisx0213 |
eucjisx0213 |
日語(yǔ) |
euc_kr |
euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 |
韓語(yǔ) |
gb2312 |
chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 |
簡(jiǎn)體中文 |
gbk |
936, cp936, ms936 |
統(tǒng)一漢語(yǔ) |
gb18030 |
gb18030-2000 |
統(tǒng)一漢語(yǔ) |
hz |
hzgb, hz-gb, hz-gb-2312 |
簡(jiǎn)體中文 |
iso2022_jp |
csiso2022jp, iso2022jp, iso-2022-jp |
日語(yǔ) |
iso2022_jp_1 |
iso2022jp-1, iso-2022-jp-1 |
日語(yǔ) |
iso2022_jp_2 |
iso2022jp-2, iso-2022-jp-2 |
日語(yǔ),韓語(yǔ),簡(jiǎn)體中文,西歐,希臘語(yǔ) |
iso2022_jp_2004 |
iso2022jp-2004, iso-2022-jp-2004 |
日語(yǔ) |
iso2022_jp_3 |
iso2022jp-3, iso-2022-jp-3 |
日語(yǔ) |
iso2022_jp_ext |
iso2022jp-ext, iso-2022-jp-ext |
日語(yǔ) |
iso2022_kr |
csiso2022kr, iso2022kr, iso-2022-kr |
韓語(yǔ) |
latin_1 |
iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 |
西歐 |
iso8859_2 |
iso-8859-2, latin2, L2 |
中歐和東歐 |
iso8859_3 |
iso-8859-3, latin3, L3 |
世界語(yǔ),馬耳他語(yǔ) |
iso8859_4 |
iso-8859-4, latin4, L4 |
波羅的海語(yǔ)言 |
iso8859_5 |
iso-8859-5, cyrillic |
保加利亞語(yǔ),白俄羅斯語(yǔ),馬其頓語(yǔ),俄語(yǔ),塞爾維亞語(yǔ) |
iso8859_6 |
iso-8859-6, arabic |
阿拉伯語(yǔ) |
iso8859_7 |
iso-8859-7, greek, greek8 |
希臘語(yǔ) |
iso8859_8 |
iso-8859-8, hebrew |
希伯來(lái)語(yǔ) |
iso8859_9 |
iso-8859-9, latin5, L5 |
土耳其語(yǔ) |
iso8859_10 |
iso-8859-10, latin6, L6 |
北歐語(yǔ)言 |
iso8859_11 |
iso-8859-11, thai |
泰語(yǔ) |
iso8859_13 |
iso-8859-13, latin7, L7 |
波羅的海語(yǔ)言 |
iso8859_14 |
iso-8859-14, latin8, L8 |
凱爾特語(yǔ) |
iso8859_15 |
iso-8859-15, latin9, L9 |
西歐 |
iso8859_16 |
iso-8859-16, latin10, L10 |
東南歐 |
johab |
cp1361, ms1361 |
韓語(yǔ) |
koi8_r |
俄語(yǔ) | |
koi8_t |
塔吉克 3.5 新版功能. | |
koi8_u |
烏克蘭語(yǔ) | |
kz1048 |
kz_1048, strk1048_2002, rk1048 |
哈薩克語(yǔ) 3.5 新版功能. |
mac_cyrillic |
maccyrillic |
保加利亞語(yǔ),白俄羅斯語(yǔ),馬其頓語(yǔ),俄語(yǔ),塞爾維亞語(yǔ) |
mac_greek |
macgreek |
希臘語(yǔ) |
mac_iceland |
maciceland |
冰島語(yǔ) |
mac_latin2 |
maclatin2, maccentraleurope, mac_centeuro |
中歐和東歐 |
mac_roman |
macroman, macintosh |
西歐 |
mac_turkish |
macturkish |
土耳其語(yǔ) |
ptcp154 |
csptcp154, pt154, cp154, cyrillic-asian |
哈薩克語(yǔ) |
shift_jis |
csshiftjis, shiftjis, sjis, s_jis |
日語(yǔ) |
shift_jis_2004 |
shiftjis2004, sjis_2004, sjis2004 |
日語(yǔ) |
shift_jisx0213 |
shiftjisx0213, sjisx0213, s_jisx0213 |
日語(yǔ) |
utf_32 |
U32, utf32 |
所有語(yǔ)言 |
utf_32_be |
UTF-32BE |
所有語(yǔ)言 |
utf_32_le |
UTF-32LE |
所有語(yǔ)言 |
utf_16 |
U16, utf16 |
所有語(yǔ)言 |
utf_16_be |
UTF-16BE |
所有語(yǔ)言 |
utf_16_le |
UTF-16LE |
所有語(yǔ)言 |
utf_7 |
U7, unicode-1-1-utf-7 |
所有語(yǔ)言 |
utf_8 |
U8, UTF, utf8, cp65001 |
所有語(yǔ)言 |
utf_8_sig |
所有語(yǔ)言 |
在 3.4 版更改: utf-16* 和 utf-32* 編碼器將不再允許編碼代理碼位 (U+D800--U+DFFF)。 utf-32* 解碼器將不再解碼與代理碼位相對(duì)應(yīng)的字節(jié)序列。
在 3.8 版更改: cp65001 現(xiàn)在是 utf_8 的一個(gè)別名。
Python 專屬的編碼格式
有一些預(yù)定義編解碼器是 Python 專屬的,因此它們?cè)?Python 之外沒(méi)有意義。 這些編解碼器按其所預(yù)期的輸入和輸出類型在下表中列出(請(qǐng)注意雖然文本編碼是編解碼器最常見(jiàn)的使用場(chǎng)景,但下層的編解碼器架構(gòu)支持任意數(shù)據(jù)轉(zhuǎn)換而不僅是文本編碼)。 對(duì)于非對(duì)稱編解碼器,該列描述的含義是編碼方向。
文字編碼
以下編解碼器提供了 str 到 bytes 的編碼和 bytes-like object 到 str 的解碼,類似于 Unicode 文本編碼。
|
編碼 |
別名 |
含意 |
|---|---|---|
idna |
實(shí)現(xiàn) RFC 3490,另請(qǐng)參閱 encodings.idna 。僅支持 | |
mbcs |
ansi, dbcs |
Windows 專屬:根據(jù) ANSI 代碼頁(yè)(CP_ACP)對(duì)操作數(shù)進(jìn)行編碼。 |
oem |
Windows 專屬:根據(jù) OEM 代碼頁(yè)(CP_OEMCP)對(duì)操作數(shù)進(jìn)行編碼。 3.6 新版功能. | |
palmos |
PalmOS 3.5 的編碼格式 | |
punycode |
實(shí)現(xiàn) RFC 3492。 不支持有狀態(tài)編解碼器。 | |
raw_unicode_escape |
Latin-1 編碼格式附帶對(duì)其他碼位以 | |
undefined |
所有轉(zhuǎn)換都將引發(fā)異常,甚至對(duì)空字符串也不例外。 錯(cuò)誤處理方案會(huì)被忽略。 | |
unicode_escape |
適合用于以 ASCII 編碼的 Python 源代碼中的 Unicode 字面值內(nèi)容的編碼格式,但引號(hào)不會(huì)被轉(zhuǎn)義。 對(duì) Latin-1 源代碼進(jìn)行解碼。 請(qǐng)注意 Python 源代碼實(shí)際上默認(rèn)使用 UTF-8。 |
在 3.8 版更改: “unicode_internal” 編解碼器已被移除。
二進(jìn)制轉(zhuǎn)換
以下編解碼器提供了二進(jìn)制轉(zhuǎn)換: bytes-like object 到 bytes 的映射。 它們不被 bytes.decode() 所支持(該方法只生成 str 類型的輸出)。
|
編碼 |
別名 |
含意 |
編碼器/解碼器 |
|---|---|---|---|
base64_codec 1 |
base64, base_64 |
將操作數(shù)轉(zhuǎn)換為多行 MIME base64 (結(jié)果總是包含一個(gè)末尾的 在 3.4 版更改: 接受任意 bytes-like object 作為輸入用于編碼和解碼 |
base64.encodebytes() / base64.decodebytes() |
bz2_codec |
bz2 |
使用bz2壓縮操作數(shù) |
bz2.compress() / bz2.decompress() |
hex_codec |
hex |
將操作數(shù)轉(zhuǎn)換為十六進(jìn)制表示,每個(gè)字節(jié)有兩位數(shù) |
binascii.b2a_hex() / binascii.a2b_hex() |
quopri_codec |
quopri, quotedprintable, quoted_printable |
將操作數(shù)轉(zhuǎn)換為 MIME 帶引號(hào)的可打印數(shù)據(jù) |
quopri.encode() 且 |
uu_codec |
uu |
使用uuencode轉(zhuǎn)換操作數(shù) |
uu.encode() / uu.decode() |
zlib_codec |
zip, zlib |
使用gzip壓縮操作數(shù) |
zlib.compress() / zlib.decompress() |
1
除了 字節(jié)類對(duì)象,'base64_codec' 也接受僅包含 ASCII 的 str 實(shí)例用于解碼
3.2 新版功能: 恢復(fù)二進(jìn)制轉(zhuǎn)換。
在 3.4 版更改: 恢復(fù)二進(jìn)制轉(zhuǎn)換的別名。
文字轉(zhuǎn)換
以下編解碼器提供了文本轉(zhuǎn)換: str 到 str 的映射。 它不被 str.encode() 所支持(該方法只生成 bytes 類型的輸出)。
|
編碼 |
別名 |
含意 |
|---|---|---|
rot_13 |
rot13 |
返回操作數(shù)的凱撒密碼加密結(jié)果 |
3.2 新版功能: 恢復(fù) rot_13 文本轉(zhuǎn)換。
在 3.4 版更改: 恢復(fù) rot13 別名。
encodings.idna —- 應(yīng)用程序中的國(guó)際化域名
此模塊實(shí)現(xiàn)了 RFC 3490 (應(yīng)用程序中的國(guó)際化域名) 和 RFC 3492 (Nameprep: 用于國(guó)際化域名 (IDN) 的 Stringprep 配置文件)。 它是在 punycode 編碼格式和 stringprep 的基礎(chǔ)上構(gòu)建的。
如果你需要來(lái)自 RFC 5891 和 RFC 5895 的 IDNA 2008 標(biāo)準(zhǔn),請(qǐng)使用第三方 idna 模塊。
這些 RFC 共同定義了一個(gè)在域名中支持非 ASCII 字符的協(xié)議。 一個(gè)包含非 ASCII 字符的域名 (例如 www.Alliancefran?aise.nu) 會(huì)被轉(zhuǎn)換為兼容 ASCII 的編碼格式 (簡(jiǎn)稱 ACE,例如 www.xn--alliancefranaise-npb.nu)。 隨后此域名的 ACE 形式可以用于所有由于特定協(xié)議而不允許使用任意字符的場(chǎng)合,例如 DNS 查詢,HTTP Host 字段等等。 此轉(zhuǎn)換是在應(yīng)用中進(jìn)行的;如有可能將對(duì)用戶可見(jiàn):應(yīng)用應(yīng)當(dāng)透明地將 Unicode 域名標(biāo)簽轉(zhuǎn)換為線上的 IDNA,并在 ACE 標(biāo)簽被呈現(xiàn)給用戶之前將其轉(zhuǎn)換回 Unicode。
Python 以多種方式支持這種轉(zhuǎn)換: idna 編解碼器執(zhí)行 Unicode 和 ACE 之間的轉(zhuǎn)換,基于在 section 3.1 of RFC 3490 中定義的分隔字符將輸入字符串拆分為標(biāo)簽,再根據(jù)需要將每個(gè)標(biāo)簽轉(zhuǎn)換為 ACE,相反地又會(huì)基于 . 分隔符將輸入字節(jié)串拆分為標(biāo)簽,再將找到的任何 ACE 標(biāo)簽轉(zhuǎn)換為 Unicode。 此外,socket 模塊可透明地將 Unicode 主機(jī)名轉(zhuǎn)換為 ACE,以便應(yīng)用在將它們傳給 socket 模塊時(shí)無(wú)須自行轉(zhuǎn)換主機(jī)名。 除此之外,許多包含以主機(jī)名作為函數(shù)參數(shù)的模塊例如 http.client 和 ftplib 都接受 Unicode 主機(jī)名(并且 http.client 也會(huì)在 Host 字段中透明地發(fā)送 IDNA 主機(jī)名,如果它需要發(fā)送該字段的話)。
當(dāng)從線路接收主機(jī)名時(shí)(例如反向名稱查找),到 Unicode 的轉(zhuǎn)換不會(huì)自動(dòng)被執(zhí)行:希望向用戶提供此種主機(jī)名的應(yīng)用應(yīng)當(dāng)將它們解碼為 Unicode。
encodings.idna 模塊還實(shí)現(xiàn)了 nameprep 過(guò)程,該過(guò)程會(huì)對(duì)主機(jī)名執(zhí)行特定的規(guī)范化操作,以實(shí)現(xiàn)國(guó)際域名的大小寫不敏感特性與合并相似的字符。 如果有需要可以直接使用 nameprep 函數(shù)。
encodings.idna.nameprep(label)
返回 label 經(jīng)過(guò)名稱處理操作的版本。 該實(shí)現(xiàn)目前基于查詢字符串,因此 AllowUnassigned 為真值。
encodings.idna.ToASCII(label)
將標(biāo)簽轉(zhuǎn)換為 ASCII,規(guī)則定義見(jiàn) RFC 3490。 UseSTD3ASCIIRules 預(yù)設(shè)為假值。
encodings.idna.ToUnicode(label)
將標(biāo)簽轉(zhuǎn)換為 Unicode,規(guī)則定義見(jiàn) RFC 3490。
encodings.mbcs —- Windows ANSI代碼頁(yè)
此模塊實(shí)現(xiàn)ANSI代碼頁(yè)(CP_ACP)。
Availability: Windows.
在 3.3 版更改: 支持任何錯(cuò)誤處理
在 3.2 版更改: 在 3.2 版之前, errors 參數(shù)會(huì)被忽略;總是會(huì)使用 'replace' 進(jìn)行編碼,并使用 'ignore' 進(jìn)行解碼。
encodings.utf_8_sig —- 帶BOM簽名的UTF-8編解碼器
此模塊實(shí)現(xiàn)了 UTF-8 編解碼器的一個(gè)變種:在編碼時(shí)將把 UTF-8 已編碼 BOM 添加到 UTF-8 編碼字節(jié)數(shù)據(jù)的開(kāi)頭。 對(duì)于有狀態(tài)編碼器此操作只執(zhí)行一次(當(dāng)首次寫入字節(jié)流時(shí))。 在解碼時(shí)將跳過(guò)數(shù)據(jù)開(kāi)頭作為可選項(xiàng)的 UTF-8 已編碼 BOM。
網(wǎng)頁(yè)標(biāo)題:創(chuàng)新互聯(lián)Python教程:codecs—-編解碼器注冊(cè)和相關(guān)基類
鏈接分享:http://www.dlmjj.cn/article/dhodids.html


咨詢
建站咨詢
