codecs
--- 編解碼器注冊和相關(guān)基類(lèi)?
源代碼: Lib/codecs.py
This module defines base classes for standard Python codecs (encoders and
decoders) and provides access to the internal Python codec registry, which
manages the codec and error handling lookup process. Most standard codecs
are text encodings, which encode text to bytes (and
decode bytes to text), but there are also codecs provided that encode text to
text, and bytes to bytes. Custom codecs may encode and decode between arbitrary
types, but some module features are restricted to be used specifically with
text encodings or with codecs that encode to
bytes
.
該模塊定義了以下用于使用任何編解碼器進(jìn)行編碼和解碼的函數:
- codecs.encode(obj, encoding='utf-8', errors='strict')?
使用為 encoding 注冊的編解碼器對 obj 進(jìn)行編碼。
可以給定 Errors 以設置所需要的錯誤處理方案。 默認的錯誤處理方案
'strict'
表示編碼錯誤將引發(fā)ValueError
(或更特定編解碼器相關(guān)的子類(lèi),例如UnicodeEncodeError
)。 請參閱 編解碼器基類(lèi) 了解有關(guān)編解碼器錯誤處理的更多信息。
- codecs.decode(obj, encoding='utf-8', errors='strict')?
使用為 encoding 注冊的編解碼器對 obj 進(jìn)行解碼。
可以給定 Errors 以設置所需要的錯誤處理方案。 默認的錯誤處理方案
'strict'
表示編碼錯誤將引發(fā)ValueError
(或更特定編解碼器相關(guān)的子類(lèi),例如UnicodeDecodeError
)。 請參閱 編解碼器基類(lèi) 了解有關(guān)編解碼器錯誤處理的更多信息。
每種編解碼器的完整細節也可以直接查找獲?。?/p>
- codecs.lookup(encoding)?
在 Python 編解碼器注冊表中查找編解碼器信息,并返回一個(gè)
CodecInfo
對象,其定義見(jiàn)下文。首先將會(huì )在注冊表緩存中查找編碼,如果未找到,則會(huì )掃描注冊的搜索函數列表。 如果沒(méi)有找到
CodecInfo
對象,則將引發(fā)LookupError
。 否則,CodecInfo
對象將被存入緩存并返回給調用者。
- class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)?
查找編解碼器注冊表所得到的編解碼器細節信息。 構造器參數將保存為同名的屬性:
- name?
編碼名稱(chēng)
- encode?
- decode?
無(wú)狀態(tài)的編碼和解碼函數。 它們必須是具有與 Codec 的
encode()
和decode()
方法相同接口的函數或方法 (參見(jiàn) Codec 接口)。 這些函數或方法應當工作于無(wú)狀態(tài)的模式。
- incrementalencoder?
- incrementaldecoder?
增量式的編碼器和解碼器類(lèi)或工廠(chǎng)函數。 這些函數必須分別提供由基類(lèi)
IncrementalEncoder
和IncrementalDecoder
所定義的接口。 增量式編解碼器可以保持狀態(tài)。
- streamwriter?
- streamreader?
流式寫(xiě)入器和讀取器類(lèi)或工廠(chǎng)函數。 這些函數必須分別提供由基類(lèi)
StreamWriter
和StreamReader
所定義的接口。 流式編解碼器可以保持狀態(tài)。
為了簡(jiǎn)化對各種編解碼器組件的訪(fǎng)問(wèn),本模塊提供了以下附加函數,它們使用 lookup()
來(lái)執行編解碼器查找:
- codecs.getencoder(encoding)?
查找給定編碼的編解碼器并返回其編碼器函數。
在編碼無(wú)法找到時(shí)將引發(fā)
LookupError
。
- codecs.getdecoder(encoding)?
查找給定編碼的編解碼器并返回其解碼器函數。
在編碼無(wú)法找到時(shí)將引發(fā)
LookupError
。
- codecs.getincrementalencoder(encoding)?
查找給定編碼的編解碼器并返回其增量式編碼器類(lèi)或工廠(chǎng)函數。
在編碼無(wú)法找到或編解碼器不支持增量式編碼器時(shí)將引發(fā)
LookupError
。
- codecs.getincrementaldecoder(encoding)?
查找給定編碼的編解碼器并返回其增量式解碼器類(lèi)或工廠(chǎng)函數。
在編碼無(wú)法找到或編解碼器不支持增量式解碼器時(shí)將引發(fā)
LookupError
。
- codecs.getreader(encoding)?
查找給定編碼的編解碼器并返回其
StreamReader
類(lèi)或工廠(chǎng)函數。在編碼無(wú)法找到時(shí)將引發(fā)
LookupError
。
- codecs.getwriter(encoding)?
查找給定編碼的編解碼器并返回其
StreamWriter
類(lèi)或工廠(chǎng)函數。在編碼無(wú)法找到時(shí)將引發(fā)
LookupError
。
自定義編解碼器的啟用是通過(guò)注冊適當的編解碼器搜索函數:
- codecs.register(search_function)?
注冊一個(gè)編解碼器搜索函數。 搜索函數預期接收一個(gè)參數,即全部以小寫(xiě)字母表示的編碼格式名稱(chēng),其中中連字符和空格會(huì )被轉換為下劃線(xiàn),并返回一個(gè)
CodecInfo
對象。 在搜索函數無(wú)法找到給定編碼格式的情況下,它應當返回None
。在 3.9 版更改: 連字符和空格會(huì )被轉換為下劃線(xiàn)。
- codecs.unregister(search_function)?
注銷(xiāo)一個(gè)編解碼器搜索函數并清空注冊表緩存。 如果指定搜索函數未被注冊,則不做任何操作。
3.10 新版功能.
雖然內置的 open()
和相關(guān)聯(lián)的 io
模塊是操作已編碼文本文件的推薦方式,但本模塊也提供了額外的工具函數和類(lèi),允許在操作二進(jìn)制文件時(shí)使用更多各類(lèi)的編解碼器:
- codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=- 1)?
使用給定的 mode 打開(kāi)已編碼的文件并返回一個(gè)
StreamReaderWriter
的實(shí)例,提供透明的編碼/解碼。 默認的文件模式為'r'
,表示以讀取模式打開(kāi)文件。備注
下層的已編碼文件總是以二進(jìn)制模式打開(kāi)。 在讀取和寫(xiě)入時(shí)不會(huì )自動(dòng)執行
'\n'
的轉換。 mode 參數可以是內置open()
函數所接受的任意二進(jìn)制模式;'b'
會(huì )被自動(dòng)添加。encoding 指定文件所要使用的編碼格式。 允許任何編碼為字節串或從字節串解碼的編碼格式,而文件方法所支持的數據類(lèi)型則取決于所使用的編解碼器。
可以指定 errors 來(lái)定義錯誤處理方案。 默認值
'strict'
表示在出現編碼錯誤時(shí)引發(fā)ValueError
。buffering 的含義與內置
open()
函數中的相同。 默認值 -1 表示將使用默認的緩沖區大小。在 3.11 版更改: The
'U'
mode has been removed.
- codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')?
返回一個(gè)
StreamRecoder
實(shí)例,它提供了 file 的透明轉碼包裝版本。 當包裝版本被關(guān)閉時(shí)原始文件也會(huì )被關(guān)閉。寫(xiě)入已包裝文件的數據會(huì )根據給定的 data_encoding 解碼,然后以使用 file_encoding 的字節形式寫(xiě)入原始文件。 從原始文件讀取的字節串將根據 file_encoding 解碼,其結果將使用 data_encoding 進(jìn)行編碼。
如果 file_encoding 未給定,則默認為 data_encoding。
可以指定 errors 來(lái)定義錯誤處理方案。 默認值
'strict'
表示在出現編碼錯誤時(shí)引發(fā)ValueError
。
- codecs.iterencode(iterator, encoding, errors='strict', **kwargs)?
使用增量式編碼器通過(guò)迭代來(lái)編碼由 iterator 所提供的輸入。 此函數屬于 generator。 errors 參數(以及任何其他關(guān)鍵字參數)會(huì )被傳遞給增量式編碼器。
此函數要求編解碼器接受
str
對象形式的文本進(jìn)行編碼。 因此它不支持字節到字節的編碼器,例如base64_codec
。
- codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)?
使用增量式解碼器通過(guò)迭代來(lái)解碼由 iterator 所提供的輸入。 此函數屬于 generator。 errors 參數(以及任何其他關(guān)鍵字參數)會(huì )被傳遞給增量式解碼器。
此函數要求編解碼器接受
bytes
對象進(jìn)行解碼。 因此它不支持文本到文本的編碼器,例如rot_13
,但是rot_13
可以通過(guò)同樣效果的iterencode()
來(lái)使用。
本模塊還提供了以下常量,適用于讀取和寫(xiě)入依賴(là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?
這些常量定義了多種字節序列,即一些編碼格式的 Unicode 字節順序標記(BOM)。 它們在 UTF-16 和 UTF-32 數據流中被用以指明所使用的字節順序,并在 UTF-8 中被用作 Unicode 簽名。
BOM_UTF16
是BOM_UTF16_BE
或BOM_UTF16_LE
,具體取決于平臺的本機字節順序,BOM
是BOM_UTF16
的別名,BOM_LE
是BOM_UTF16_LE
的別名,BOM_BE
是BOM_UTF16_BE
的別名。 其他序列則表示 UTF-8 和 UTF-32 編碼格式中的 BOM。
編解碼器基類(lèi)?
codecs
模塊定義了一系列基類(lèi)用來(lái)定義配合編解碼器對象進(jìn)行工作的接口,并且也可用作定制編解碼器實(shí)現的基礎。
每種編解碼器必須定義四個(gè)接口以便用作 Python 中的編解碼器:無(wú)狀態(tài)編碼器、無(wú)狀態(tài)解碼器、流讀取器和流寫(xiě)入器。 流讀取器和寫(xiě)入器通常會(huì )重用無(wú)狀態(tài)編碼器/解碼器來(lái)實(shí)現文件協(xié)議。 編解碼器作者還需要定義編解碼器將如何處理編碼和解碼錯誤。
錯誤處理方案?
To simplify and standardize error handling, codecs may implement different error handling schemes by accepting the errors string argument:
>>> 'German ?, ?'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ?, ?'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German ß, ♬'
The following error handlers can be used with all Python 標準編碼 codecs:
值 |
含意 |
---|---|
|
Raise |
|
忽略錯誤格式的數據并且不加進(jìn)一步通知就繼續執行。 在 |
|
Replace with a replacement marker. On
encoding, use |
|
Replace with backslashed escape sequences.
On encoding, use hexadecimal form of Unicode
code point with formats |
|
在解碼時(shí),將字節替換為 |
The following error handlers are only applicable to encoding (within text encodings):
值 |
含意 |
---|---|
|
Replace with XML/HTML numeric character
reference, which is a decimal form of Unicode
code point with format |
|
Replace with |
此外,以下錯誤處理方案被專(zhuān)門(mén)用于指定的編解碼器:
值 |
編解碼器 |
含意 |
---|---|---|
|
utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le |
Allow encoding and decoding surrogate code
point ( |
3.1 新版功能: 'surrogateescape'
和 'surrogatepass'
錯誤處理方案。
在 3.4 版更改: The 'surrogatepass'
error handler now works with utf-16* and utf-32*
codecs.
3.5 新版功能: 'namereplace'
錯誤處理方案。
在 3.5 版更改: The 'backslashreplace'
error handler now works with decoding and
translating.
允許的值集合可以通過(guò)注冊新命名的錯誤處理方案來(lái)擴展:
- codecs.register_error(name, error_handler)?
在名稱(chēng) name 之下注冊錯誤處理函數 error_handler。 當 name 被指定為錯誤形參時(shí),error_handler 參數所指定的對象將在編碼和解碼期間發(fā)生錯誤的情況下被調用,
對于編碼操作,將會(huì )調用 error_handler 并傳入一個(gè)
UnicodeEncodeError
實(shí)例,其中包含有關(guān)錯誤位置的信息。 錯誤處理程序必須引發(fā)此異?;騽e的異常,或者也可以返回一個(gè)元組,其中包含輸入的不可編碼部分的替換對象,以及應當繼續進(jìn)行編碼的位置。 替換對象可以為str
或bytes
類(lèi)型。 如果替換對象為字節串,編碼器將簡(jiǎn)單地將其復制到輸出緩沖區。 如果替換對象為字符串,編碼器將對替換對象進(jìn)行編碼。 對原始輸入的編碼操作會(huì )在指定位置繼續進(jìn)行。 負的位置值將被視為相對于輸入字符串的末尾。 如果結果位置超出范圍則將引發(fā)IndexError
。解碼和轉換的做法很相似,不同之處在于將把
UnicodeDecodeError
或UnicodeTranslateError
傳給處理程序,并且來(lái)自錯誤處理程序的替換對象將被直接放入輸出。
之前注冊的錯誤處理方案(包括標準錯誤處理方案)可通過(guò)名稱(chēng)進(jìn)行查找:
- codecs.lookup_error(name)?
返回之前在名稱(chēng) name 之下注冊的錯誤處理方案。
在處理方案無(wú)法找到時(shí)將引發(fā)
LookupError
。
以下標準錯誤處理方案也可通過(guò)模塊層級函數的方式來(lái)使用:
- codecs.strict_errors(exception)?
Implements the
'strict'
error handling.Each encoding or decoding error raises a
UnicodeError
.
- codecs.ignore_errors(exception)?
Implements the
'ignore'
error handling.Malformed data is ignored; encoding or decoding is continued without further notice.
- codecs.replace_errors(exception)?
Implements the
'replace'
error handling.Substitutes
?
(ASCII character) for encoding errors or?
(U+FFFD, the official REPLACEMENT CHARACTER) for decoding errors.
- codecs.backslashreplace_errors(exception)?
Implements the
'backslashreplace'
error handling.Malformed data is replaced by a backslashed escape sequence. On encoding, use the hexadecimal form of Unicode code point with formats
\xhh
\uxxxx
\Uxxxxxxxx
. On decoding, use the hexadecimal form of byte value with format\xhh
.在 3.5 版更改: Works with decoding and translating.
- codecs.xmlcharrefreplace_errors(exception)?
Implements the
'xmlcharrefreplace'
error handling (for encoding within text encoding only).The unencodable character is replaced by an appropriate XML/HTML numeric character reference, which is a decimal form of Unicode code point with format
&#num;
.
- codecs.namereplace_errors(exception)?
Implements the
'namereplace'
error handling (for encoding within text encoding only).The unencodable character is replaced by a
\N{...}
escape sequence. The set of characters that appear in the braces is the Name property from Unicode Character Database. For example, the German lowercase letter'?'
will be converted to byte sequence\N{LATIN SMALL LETTER SHARP S}
.3.5 新版功能.
無(wú)狀態(tài)的編碼和解碼?
基本 Codec
類(lèi)定義了這些方法,同時(shí)還定義了無(wú)狀態(tài)編碼器和解碼器的函數接口:
- Codec.encode(input, errors='strict')?
編碼 input 對象并返回一個(gè)元組 (輸出對象, 消耗長(cháng)度)。 例如,text encoding 會(huì )使用特定的字符集編碼格式 (例如
cp1252
或iso-8859-1
) 將字符串轉換為字節串對象。errors 參數定義了要應用的錯誤處理方案。 默認為
'strict'
處理方案。此方法不一定會(huì )在
Codec
實(shí)例中保存狀態(tài)。 可使用必須保存狀態(tài)的StreamWriter
作為編解碼器以便高效地進(jìn)行編碼。編碼器必須能夠處理零長(cháng)度的輸入并在此情況下返回輸出對象類(lèi)型的空對象。
- Codec.decode(input, errors='strict')?
解碼 input 對象并返回一個(gè)元組 (輸出對象, 消耗長(cháng)度)。 例如,text encoding 的解碼操作會(huì )使用特定的字符集編碼格式將字節串對象轉換為字符串對象。
對于文本編碼格式和字節到字節編解碼器,input 必須為一個(gè)字節串對象或提供了只讀緩沖區接口的對象 -- 例如,緩沖區對象和映射到內存的文件。
errors 參數定義了要應用的錯誤處理方案。 默認為
'strict'
處理方案。此方法不一定會(huì )在
Codec
實(shí)例中保存狀態(tài)。 可使用必須保存狀態(tài)的StreamReader
作為編解碼器以便高效地進(jìn)行解碼。解碼器必須能夠處理零長(cháng)度的輸入并在此情況下返回輸出對象類(lèi)型的空對象。
增量式的編碼和解碼?
IncrementalEncoder
和 IncrementalDecoder
類(lèi)提供了增量式編碼和解碼的基本接口。 對輸入的編碼/解碼不是通過(guò)對無(wú)狀態(tài)編碼器/解碼器的一次調用,而是通過(guò)對增量式編碼器/解碼器的 encode()
/decode()
方法的多次調用。 增量式編碼器/解碼器會(huì )在方法調用期間跟蹤編碼/解碼過(guò)程。
調用 encode()
/decode()
方法后的全部輸出相當于將所有通過(guò)無(wú)狀態(tài)編碼器/解碼器進(jìn)行編碼/解碼的單個(gè)輸入連接在一起所得到的輸出。
IncrementalEncoder 對象?
IncrementalEncoder
類(lèi)用來(lái)對一個(gè)輸入進(jìn)行分步編碼。 它定義了以下方法,每個(gè)增量式編碼器都必須定義這些方法以便與 Python 編解碼器注冊表相兼容。
- class codecs.IncrementalEncoder(errors='strict')?
IncrementalEncoder
實(shí)例的構造器。所有增量式編碼器必須提供此構造器接口。 它們可以自由地添加額外的關(guān)鍵字參數,但只有在這里定義的參數才會(huì )被 Python 編解碼器注冊表所使用。
IncrementalEncoder
可以通過(guò)提供 errors 關(guān)鍵字參數來(lái)實(shí)現不同的錯誤處理方案。 可用的值請參閱 錯誤處理方案。errors 參數將被賦值給一個(gè)同名的屬性。 通過(guò)對此屬性賦值就可以在
IncrementalEncoder
對象的生命期內在不同的錯誤處理策略之間進(jìn)行切換。- encode(object, final=False)?
編碼 object (會(huì )將編碼器的當前狀態(tài)納入考慮) 并返回已編碼的結果對象。 如果這是對
encode()
的最終調用則 final 必須為真值(默認為假值)。
- reset()?
將編碼器重置為初始狀態(tài)。 輸出將被丟棄:調用
.encode(object, final=True)
,在必要時(shí)傳入一個(gè)空字節串或字符串,重置編碼器并得到輸出。
- getstate()?
返回編碼器的當前狀態(tài),該值必須為一個(gè)整數。 實(shí)現應當確保
0
是最常見(jiàn)的狀態(tài)。 (比整數更復雜的狀態(tài)表示可以通過(guò)編組/選擇狀態(tài)并將結果字符串的字節數據編碼為整數來(lái)轉換為一個(gè)整數值)。
- setstate(state)?
將編碼器的狀態(tài)設為 state。 state 必須為
getstate()
所返回的一個(gè)編碼器狀態(tài)。
IncrementalDecoder 對象?
IncrementalDecoder
類(lèi)用來(lái)對一個(gè)輸入進(jìn)行分步解碼。 它定義了以下方法,每個(gè)增量式解碼器都必須定義這些方法以便與 Python 編解碼器注冊表相兼容。
- class codecs.IncrementalDecoder(errors='strict')?
IncrementalDecoder
實(shí)例的構造器。所有增量式解碼器必須提供此構造器接口。 它們可以自由地添加額外的關(guān)鍵字參數,但只有在這里定義的參數才會(huì )被 Python 編解碼器注冊表所使用。
IncrementalDecoder
可以通過(guò)提供 errors 關(guān)鍵字參數來(lái)實(shí)現不同的錯誤處理方案。 可用的值請參閱 錯誤處理方案。errors 參數將被賦值給一個(gè)同名的屬性。 通過(guò)對此屬性賦值就可以在
IncrementalDecoder
對象的生命期內在不同的錯誤處理策略之間進(jìn)行切換。- decode(object, final=False)?
解碼 object (會(huì )將解碼器的當前狀態(tài)納入考慮) 并返回已解碼的結果對象。 如果這是對
decode()
的最終調用則 final 必須為真值(默認為假值)。 如果 final 為真值則解碼器必須對輸入進(jìn)行完全解碼并且必須 刷新所有緩沖區。 如果這無(wú)法做到(例如由于在輸入結束時(shí)字節串序列不完整)則它必須像在無(wú)狀態(tài)的情況下那樣初始化錯誤處理(這可能引發(fā)一個(gè)異常)。
- reset()?
將解碼器重置為初始狀態(tài)。
- getstate()?
返回解碼器的當前狀態(tài)。 這必須為一個(gè)二元組,第一項必須是包含尚未解碼的輸入的緩沖區。 第二項必須為一個(gè)整數,可以表示附加狀態(tài)信息。 (實(shí)現應當確保
0
是最常見(jiàn)的附加狀態(tài)信息。) 如果此附加狀態(tài)信息為0
則必須可以將解碼器設為沒(méi)有已緩沖輸入并且以0
作為附加狀態(tài)信息,以便將先前已緩沖的輸入饋送到解碼器使其返回到先前的狀態(tài)而不產(chǎn)生任何輸出。 (比整數更復雜的附加狀態(tài)信息可以通過(guò)編組/選擇狀態(tài)信息并將結果字符串的字節數據編碼為整數來(lái)轉換為一個(gè)整數值。)
- setstate(state)?
將解碼器的狀態(tài)設為 state。 state 必須為
getstate()
所返回的一個(gè)解碼器狀態(tài)。
流式的編碼和解碼?
StreamWriter
和 StreamReader
類(lèi)提供了一些泛用工作接口,可被用來(lái)非常方便地實(shí)現新的編碼格式子模塊。 請參閱 encodings.utf_8
中的示例了解如何做到這一點(diǎn)。
StreamWriter 對象?
StreamWriter
類(lèi)是 Codec
的子類(lèi),它定義了以下方法,每個(gè)流式寫(xiě)入器都必須定義這些方法以便與 Python 編解碼器注冊表相兼容。
- class codecs.StreamWriter(stream, errors='strict')?
StreamWriter
實(shí)例的構造器。所有流式寫(xiě)入器必須提供此構造器接口。 它們可以自由地添加額外的關(guān)鍵字參數,但只有在這里定義的參數才會(huì )被 Python 編解碼器注冊表所使用。
stream 參數必須為一個(gè)基于特定編解碼器打開(kāi)用于寫(xiě)入文本或二進(jìn)制數據的文件類(lèi)對象。
StreamWriter
可以通過(guò)提供 errors 關(guān)鍵字參數來(lái)實(shí)現不同的錯誤處理方案。 請參閱 錯誤處理方案 了解下層的流式編解碼器可支持的標準錯誤處理方案。errors 參數將被賦值給一個(gè)同名的屬性。 通過(guò)對此屬性賦值就可以在
StreamWriter
對象的生命期內在不同的錯誤處理策略之間進(jìn)行切換。- write(object)?
將編碼后的對象內容寫(xiě)入到流。
- writelines(list)?
Writes the concatenated iterable of strings to the stream (possibly by reusing the
write()
method). Infinite or very large iterables are not supported. The standard bytes-to-bytes codecs do not support this method.
- reset()?
重置用于保持內部狀態(tài)的編解碼器緩沖區。
調用此方法應當確保在干凈的狀態(tài)下放入輸出數據,以允許直接添加新的干凈數據而無(wú)須重新掃描整個(gè)流來(lái)恢復狀態(tài)。
除了上述的方法,StreamWriter
還必須繼承來(lái)自下層流的所有其他方法和屬性。
StreamReader 對象?
StreamReader
類(lèi)是 Codec
的子類(lèi),它定義了以下方法,每個(gè)流式讀取器都必須定義這些方法以便與 Python 編解碼器注冊表相兼容。
- class codecs.StreamReader(stream, errors='strict')?
StreamReader
實(shí)例的構造器。所有流式讀取器必須提供此構造器接口。 它們可以自由地添加額外的關(guān)鍵字參數,但只有在這里定義的參數才會(huì )被 Python 編解碼器注冊表所使用。
stream 參數必須為一個(gè)基于特定編解碼器打開(kāi)用于讀取文本或二進(jìn)制數據的文件類(lèi)對象。
StreamReader
可以通過(guò)提供 errors 關(guān)鍵字參數來(lái)實(shí)現不同的錯誤處理方案。 請參閱 錯誤處理方案 了解下層的流式編解碼器可支持的標準錯誤處理方案。errors 參數將被賦值給一個(gè)同名的屬性。 通過(guò)對此屬性賦值就可以在
StreamReader
對象的生命期內在不同的錯誤處理策略之間進(jìn)行切換。errors 參數所允許的值集合可以使用
register_error()
來(lái)擴展。- read(size=- 1, chars=- 1, firstline=False)?
解碼來(lái)自流的數據并返回結果對象。
chars 參數指明要返回的解碼后碼位或字節數量。
read()
方法絕不會(huì )返回超出請求數量的數據,但如果可用數量不足,它可能返回少于請求數量的數據。size 參數指明要讀取并解碼的已編碼字節或碼位的最大數量近似值。 解碼器可以適當地修改此設置。 默認值 -1 表示盡可能多地讀取并解碼。 此形參的目的是防止一次性解碼過(guò)于巨大的文件。
firstline 旗標指明如果在后續行發(fā)生解碼錯誤,則僅返回第一行就足夠了。
此方法應當使用“貪婪”讀取策略,這意味著(zhù)它應當在編碼格式定義和給定大小所允許的情況下盡可能多地讀取數據,例如,如果在流上存在可選的編碼結束或狀態(tài)標記,這些內容也應當被讀取。
- readline(size=None, keepends=True)?
從輸入流讀取一行并返回解碼后的數據。
如果給定了 size,則將其作為 size 參數傳遞給流的
read()
方法。如果 keepends 為假值,則行結束符將從返回的行中去除。
- readlines(sizehint=None, keepends=True)?
從輸入流讀取所有行并將其作為一個(gè)行列表返回。
行結束符會(huì )使用編解碼器的
decode()
方法來(lái)實(shí)現,并且如果 keepends 為真值則會(huì )將其包含在列表條目中。如果給定了 sizehint,則將其作為 size 參數傳遞給流的
read()
方法。
- reset()?
重置用于保持內部狀態(tài)的編解碼器緩沖區。
請注意不應當對流進(jìn)行重定位。 使用此方法的主要目的是為了能夠從解碼錯誤中恢復。
除了上述的方法,StreamReader
還必須繼承來(lái)自下層流的所有其他方法和屬性。
StreamReaderWriter 對象?
StreamReaderWriter
是一個(gè)方便的類(lèi),允許對同時(shí)工作于讀取和寫(xiě)入模式的流進(jìn)行包裝。
其設計使得開(kāi)發(fā)者可以使用 lookup()
函數所返回的工廠(chǎng)函數來(lái)構造實(shí)例。
- class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')?
創(chuàng )建一個(gè)
StreamReaderWriter
實(shí)例。 stream 必須為一個(gè)文件類(lèi)對象。 Reader 和 Writer 必須為分別提供了StreamReader
和StreamWriter
接口的工廠(chǎng)函數或類(lèi)。 錯誤處理通過(guò)與流式讀取器和寫(xiě)入器所定義的相同方式來(lái)完成。
StreamReaderWriter
實(shí)例定義了 StreamReader
和 StreamWriter
類(lèi)的組合接口。 它們還繼承了來(lái)自下層流的所有其他方法和屬性。
StreamRecoder 對象?
StreamRecoder
將數據從一種編碼格式轉換為另一種,這對于處理不同編碼環(huán)境的情況有時(shí)會(huì )很有用。
其設計使得開(kāi)發(fā)者可以使用 lookup()
函數所返回的工廠(chǎng)函數來(lái)構造實(shí)例。
- class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict')?
創(chuàng )建一個(gè)實(shí)現了雙向轉換的
StreamRecoder
實(shí)例: encode 和 decode 工作于前端 — 對代碼可見(jiàn)的數據調用read()
和write()
,而 Reader 和 Writer 工作于后端 — stream 中的數據。你可以使用這些對象來(lái)進(jìn)行透明轉碼,例如從 Latin-1 轉為 UTF-8 以及反向轉換。
stream 參數必須為一個(gè)文件類(lèi)對象。
encode 和 decode 參數必須遵循
Codec
接口。 Reader 和 Writer 必須為分別提供了StreamReader
和StreamWriter
接口對象的工廠(chǎng)函數或類(lèi)。錯誤處理通過(guò)與流式讀取器和寫(xiě)入器所定義的相同方式來(lái)完成。
StreamRecoder
實(shí)例定義了 StreamReader
和 StreamWriter
類(lèi)的組合接口。 它們還繼承了來(lái)自下層流的所有其他方法和屬性。
編碼格式與 Unicode?
Strings are stored internally as sequences of code points in
range U+0000
--U+10FFFF
. (See PEP 393 for
more details about the implementation.)
Once a string object is used outside of CPU and memory, endianness
and how these arrays are stored as bytes become an issue. As with other
codecs, serialising a string into a sequence of bytes is known as encoding,
and recreating the string from the sequence of bytes is known as decoding.
There are a variety of different text serialisation codecs, which are
collectivity referred to as text encodings.
最簡(jiǎn)單的文本編碼格式 (稱(chēng)為 'latin-1'
或 'iso-8859-1'
) 將碼位 0--255 映射為字節值 0x0
--0xff
,這意味著(zhù)包含 U+00FF
以上碼位的字符串對象無(wú)法使用此編解碼器進(jìn)行編碼。 這樣做將引發(fā) UnicodeEncodeError
,其形式類(lèi)似下面這樣(不過(guò)詳細的錯誤信息可能會(huì )有所不同): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256)
。
還有另外一組編碼格式(所謂的字符映射編碼)會(huì )選擇全部 Unicode 碼位的不同子集并設定如何將這些碼位映射為字節值 0x0
--0xff
。 要查看這是如何實(shí)現的,只需簡(jiǎn)單地打開(kāi)相應源碼例如 encodings/cp1252.py
(這是一個(gè)主要在 Windows 上使用的編碼格式)。 其中會(huì )有一個(gè)包含 256 個(gè)字符的字符串常量,指明每個(gè)字符所映射的字節值。
All of these encodings can only encode 256 of the 1114112 code points
defined in Unicode. A simple and straightforward way that can store each Unicode
code point, is to store each code point as four consecutive bytes. There are two
possibilities: store the bytes in big endian or in little endian order. These
two encodings are called UTF-32-BE
and UTF-32-LE
respectively. Their
disadvantage is that if e.g. you use UTF-32-BE
on a little endian machine you
will always have to swap bytes on encoding and decoding. UTF-32
avoids this
problem: bytes will always be in natural endianness. When these bytes are read
by a CPU with a different endianness, then bytes have to be swapped though. To
be able to detect the endianness of a UTF-16
or UTF-32
byte sequence,
there's the so called BOM ("Byte Order Mark"). This is the Unicode character
U+FEFF
. This character can be prepended to every UTF-16
or UTF-32
byte sequence. The byte swapped version of this character (0xFFFE
) is an
illegal character that may not appear in a Unicode text. So when the
first character in a UTF-16
or UTF-32
byte sequence
appears to be a U+FFFE
the bytes have to be swapped on decoding.
Unfortunately the character U+FEFF
had a second purpose as
a ZERO WIDTH NO-BREAK SPACE
: a character that has no width and doesn't allow
a word to be split. It can e.g. be used to give hints to a ligature algorithm.
With Unicode 4.0 using U+FEFF
as a ZERO WIDTH NO-BREAK SPACE
has been
deprecated (with U+2060
(WORD JOINER
) assuming this role). Nevertheless
Unicode software still must be able to handle U+FEFF
in both roles: as a BOM
it's a device to determine the storage layout of the encoded bytes, and vanishes
once the byte sequence has been decoded into a string; as a ZERO WIDTH
NO-BREAK SPACE
it's a normal character that will be decoded like any other.
There's another encoding that is able to encode the full range of Unicode
characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues
with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two
parts: marker bits (the most significant bits) and payload bits. The marker bits
are a sequence of zero to four 1
bits followed by a 0
bit. Unicode characters are
encoded like this (with x being payload bits, which when concatenated give the
Unicode character):
范圍 |
編碼 |
---|---|
|
0xxxxxxx |
|
110xxxxx 10xxxxxx |
|
1110xxxx 10xxxxxx 10xxxxxx |
|
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Unicode 字符最不重要的一個(gè)位就是最右側的二進(jìn)制位 x。
由于 UTF-8 是一種 8 位編碼格式,因此 BOM 是不必要的,并且已編碼字符串中的任何 U+FEFF
字符(即使是作為第一個(gè)字符)都會(huì )被視為是 ZERO WIDTH NO-BREAK SPACE
。
Without external information it's impossible to reliably determine which
encoding was used for encoding a string. Each charmap encoding can
decode any random byte sequence. However that's not possible with UTF-8, as
UTF-8 byte sequences have a structure that doesn't allow arbitrary byte
sequences. To increase the reliability with which a UTF-8 encoding can be
detected, Microsoft invented a variant of UTF-8 (that Python calls
"utf-8-sig"
) for its Notepad program: Before any of the Unicode characters
is written to the file, a UTF-8 encoded BOM (which looks like this as a byte
sequence: 0xef
, 0xbb
, 0xbf
) is written. As it's rather improbable
that any charmap encoded file starts with these byte values (which would e.g.
map to
LATIN SMALL LETTER I WITH DIAERESISRIGHT-POINTING DOUBLE ANGLE QUOTATION MARKINVERTED QUESTION MARK
對于 iso-8859-1 編碼格式來(lái)說(shuō)),這提升了根據字節序列來(lái)正確猜測 utf-8-sig
編碼格式的成功率。 所以在這里 BOM 的作用并不是幫助確定生成字節序列所使用的字節順序,而是作為幫助猜測編碼格式的記號。 在進(jìn)行編碼時(shí) utf-8-sig 編解碼器將把 0xef
, 0xbb
, 0xbf
作為頭三個(gè)字節寫(xiě)入文件。 在進(jìn)行解碼時(shí) utf-8-sig
將跳過(guò)這三個(gè)字節,如果它們作為文件的頭三個(gè)字節出現的話(huà)。 在 UTF-8 中并不推薦使用 BOM,通常應當避免它們的出現。
標準編碼?
Python 自帶了許多內置的編解碼器,它們的實(shí)現或者是通過(guò) C 函數,或者是通過(guò)映射表。 以下表格是按名稱(chēng)排序的編解碼器列表,并提供了一些常見(jiàn)別名以及編碼格式通常針對的語(yǔ)言。 別名和語(yǔ)言列表都不是詳盡無(wú)遺的。 請注意僅有大小寫(xiě)區別或使用連字符替代下劃線(xiàn)的拼寫(xiě)形式也都是有效的別名;因此,'utf-8'
是 'utf_8'
編解碼器的有效別名。
CPython implementation detail: 有些常見(jiàn)編碼格式可以繞過(guò)編解碼器查找機制來(lái)提升性能。 這些優(yōu)化機會(huì )對于 CPython 來(lái)說(shuō)僅能通過(guò)一組有限的別名(大小寫(xiě)不敏感)來(lái)識別:utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 專(zhuān)屬), ascii, us-ascii, utf-16, utf16, utf-32, utf32, 也包括使用下劃線(xiàn)替代連字符的的形式。 使用這些編碼格式的其他別名可能會(huì )導致更慢的執行速度。
在 3.6 版更改: 可識別針對 us-ascii 的優(yōu)化機會(huì )。
許多字符集都支持相同的語(yǔ)言。 它們在個(gè)別字符(例如是否支持 EURO SIGN 等)以及給字符所分配的碼位方面存在差異。 特別是對于歐洲語(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 |
統一漢語(yǔ) |
gb18030 |
gb18030-2000 |
統一漢語(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* 解碼器將不再解碼與代理碼位相對應的字節序列。
在 3.8 版更改: cp65001
現在是 utf_8
的一個(gè)別名。
Python 專(zhuān)屬的編碼格式?
有一些預定義編解碼器是 Python 專(zhuān)屬的,因此它們在 Python 之外沒(méi)有意義。 這些編解碼器按其所預期的輸入和輸出類(lèi)型在下表中列出(請注意雖然文本編碼是編解碼器最常見(jiàn)的使用場(chǎng)景,但下層的編解碼器架構支持任意數據轉換而不僅是文本編碼)。 對于非對稱(chēng)編解碼器,該列描述的含義是編碼方向。
文字編碼?
以下編解碼器提供了 str
到 bytes
的編碼和 bytes-like object 到 str
的解碼,類(lèi)似于 Unicode 文本編碼。
編碼 |
別名 |
含意 |
---|---|---|
idna |
實(shí)現 RFC 3490,另請參閱 |
|
mbcs |
ansi, dbcs |
Windows 專(zhuān)屬:根據 ANSI 代碼頁(yè)(CP_ACP)對操作數進(jìn)行編碼。 |
oem |
Windows 專(zhuān)屬:根據 OEM 代碼頁(yè)(CP_OEMCP)對操作數進(jìn)行編碼。 3.6 新版功能. |
|
palmos |
PalmOS 3.5 的編碼格式 |
|
punycode |
實(shí)現 RFC 3492。 不支持有狀態(tài)編解碼器。 |
|
raw_unicode_escape |
Latin-1 編碼格式附帶對其他碼位以 |
|
undefined |
所有轉換都將引發(fā)異常,甚至對空字符串也不例外。 錯誤處理方案會(huì )被忽略。 |
|
unicode_escape |
適合用于以 ASCII 編碼的 Python 源代碼中的 Unicode 字面值內容的編碼格式,但引號不會(huì )被轉義。 對 Latin-1 源代碼進(jìn)行解碼。 請注意 Python 源代碼實(shí)際上默認使用 UTF-8。 |
在 3.8 版更改: "unicode_internal" 編解碼器已被移除。
二進(jìn)制轉換?
以下編解碼器提供了二進(jìn)制轉換: bytes-like object 到 bytes
的映射。 它們不被 bytes.decode()
所支持(該方法只生成 str
類(lèi)型的輸出)。
編碼 |
別名 |
含意 |
編碼器/解碼器 |
---|---|---|---|
base64_codec 1 |
base64, base_64 |
將操作數轉換為多行 MIME base64 (結果總是包含一個(gè)末尾的 在 3.4 版更改: 接受任意 bytes-like object 作為輸入用于編碼和解碼 |
|
bz2_codec |
bz2 |
使用bz2壓縮操作數 |
|
hex_codec |
hex |
將操作數轉換為十六進(jìn)制表示,每個(gè)字節有兩位數 |
|
quopri_codec |
quopri, quotedprintable, quoted_printable |
將操作數轉換為 MIME 帶引號的可打印數據 |
|
uu_codec |
uu |
使用uuencode轉換操作數 |
|
zlib_codec |
zip, zlib |
使用gzip壓縮操作數 |
- 1
除了 字節類(lèi)對象,
'base64_codec'
也接受僅包含 ASCII 的str
實(shí)例用于解碼
3.2 新版功能: 恢復二進(jìn)制轉換。
在 3.4 版更改: 恢復二進(jìn)制轉換的別名。
文字轉換?
以下編解碼器提供了文本轉換: str
到 str
的映射。 它不被 str.encode()
所支持(該方法只生成 bytes
類(lèi)型的輸出)。
編碼 |
別名 |
含意 |
---|---|---|
rot_13 |
rot13 |
返回操作數的凱撒密碼加密結果 |
3.2 新版功能: 恢復 rot_13
文本轉換。
在 3.4 版更改: 恢復 rot13
別名。
encodings.idna
--- 應用程序中的國際化域名?
此模塊實(shí)現了 RFC 3490 (應用程序中的國際化域名) 和 RFC 3492 (Nameprep: 用于國際化域名 (IDN) 的 Stringprep 配置文件)。 它是在 punycode
編碼格式和 stringprep
的基礎上構建的。
If you need the IDNA 2008 standard from RFC 5891 and RFC 5895, use the third-party idna module.
這些 RFC 共同定義了一個(gè)在域名中支持非 ASCII 字符的協(xié)議。 一個(gè)包含非 ASCII 字符的域名 (例如 www.Alliancefran?aise.nu
) 會(huì )被轉換為兼容 ASCII 的編碼格式 (簡(jiǎn)稱(chēng) ACE,例如 www.xn--alliancefranaise-npb.nu
)。 隨后此域名的 ACE 形式可以用于所有由于特定協(xié)議而不允許使用任意字符的場(chǎng)合,例如 DNS 查詢(xún),HTTP Host 字段等等。 此轉換是在應用中進(jìn)行的;如有可能將對用戶(hù)可見(jiàn):應用應當透明地將 Unicode 域名標簽轉換為線(xiàn)上的 IDNA,并在 ACE 標簽被呈現給用戶(hù)之前將其轉換回 Unicode。
Python 以多種方式支持這種轉換: idna
編解碼器執行 Unicode 和 ACE 之間的轉換,基于在 section 3.1 of RFC 3490 中定義的分隔字符將輸入字符串拆分為標簽,再根據需要將每個(gè)標簽轉換為 ACE,相反地又會(huì )基于 .
分隔符將輸入字節串拆分為標簽,再將找到的任何 ACE 標簽轉換為 Unicode。 此外,socket
模塊可透明地將 Unicode 主機名轉換為 ACE,以便應用在將它們傳給 socket 模塊時(shí)無(wú)須自行轉換主機名。 除此之外,許多包含以主機名作為函數參數的模塊例如 http.client
和 ftplib
都接受 Unicode 主機名(并且 http.client
也會(huì )在 Host 字段中透明地發(fā)送 IDNA 主機名,如果它需要發(fā)送該字段的話(huà))。
當從線(xiàn)路接收主機名時(shí)(例如反向名稱(chēng)查找),到 Unicode 的轉換不會(huì )自動(dòng)被執行:希望向用戶(hù)提供此種主機名的應用應當將它們解碼為 Unicode。
encodings.idna
模塊還實(shí)現了 nameprep 過(guò)程,該過(guò)程會(huì )對主機名執行特定的規范化操作,以實(shí)現國際域名的大小寫(xiě)不敏感特性與合并相似的字符。 如果有需要可以直接使用 nameprep 函數。
- encodings.idna.nameprep(label)?
返回 label 經(jīng)過(guò)名稱(chēng)處理操作的版本。 該實(shí)現目前基于查詢(xún)字符串,因此
AllowUnassigned
為真值。
encodings.mbcs
--- Windows ANSI代碼頁(yè)?
此模塊實(shí)現ANSI代碼頁(yè)(CP_ACP)。
Availability: 僅Windows可用
在 3.3 版更改: 支持任何錯誤處理
在 3.2 版更改: 在 3.2 版之前, errors 參數會(huì )被忽略;總是會(huì )使用 'replace'
進(jìn)行編碼,并使用 'ignore'
進(jìn)行解碼。
encodings.utf_8_sig
--- 帶BOM簽名的UTF-8編解碼器?
此模塊實(shí)現了 UTF-8 編解碼器的一個(gè)變種:在編碼時(shí)將把 UTF-8 已編碼 BOM 添加到 UTF-8 編碼字節數據的開(kāi)頭。 對于有狀態(tài)編碼器此操作只執行一次(當首次寫(xiě)入字節流時(shí))。 在解碼時(shí)將跳過(guò)數據開(kāi)頭作為可選項的 UTF-8 已編碼 BOM。