标准编码
Python 自带了许多内置的编解码器,它们的实现或者是通过 C 函数,或者是通过映射表。 以下表格是按名称排序的编解码器列表,并提供了一些常见别名以及编码格式通常针对的语言。 别名和语言列表都不是详尽无遗的。 请注意仅有大小写区别或使用连字符替代下划线的拼写形式也都是有效的别名;因此,'utf-8'
是 'utf_8'
编解码器的有效别名。
CPython implementation detail: 有些常见编码格式可以绕过编解码器查找机制来提升性能。 这些优化机会对于 CPython 来说仅能通过一组有限的别名(大小写不敏感)来识别:utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 专属), ascii, us-ascii, utf-16, utf16, utf-32, utf32, 也包括使用下划线替代连字符的的形式。 使用这些编码格式的其他别名可能会导致更慢的执行速度。
在 3.6 版更改: 可识别针对 us-ascii 的优化机会。
许多字符集都支持相同的语言。 它们在个别字符(例如是否支持 EURO SIGN 等)以及给字符所分配的码位方面存在差异。 特别是对于欧洲语言来说,通常存在以下几种变体:
- 某个 ISO 8859 编码集
- 某个 Microsoft Windows 编码页,通常是派生自某个 8859 编码集,但会用附加的图形字符来替换控制字符。
- 某个 IBM EBCDIC 编码页
- 某个 IBM PC 编码页,通常会兼容 ASCII
编码 | 别名 | 语言 |
---|---|---|
ascii | 646, us-ascii | 英语 |
big5 | big5-tw, csbig5 | 繁体中文 |
big5hkscs | big5-hkscs, hkscs | 繁体中文 |
cp037 | IBM037, IBM039 | 英语 |
cp273 | 273, IBM273, csIBM273 | 德语3.4 新版功能. |
cp424 | EBCDIC-CP-HE, IBM424 | 希伯来语 |
cp437 | 437, IBM437 | 英语 |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | 西欧 |
cp720 | 阿拉伯语 | |
cp737 | 希腊语 | |
cp775 | IBM775 | 波罗的海语言 |
cp850 | 850, IBM850 | 西欧 |
cp852 | 852, IBM852 | 中欧和东欧 |
cp855 | 855, IBM855 | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
cp856 | 希伯来语 | |
cp857 | 857, IBM857 | 土耳其语 |
cp858 | 858, IBM858 | 西欧 |
cp860 | 860, IBM860 | 葡萄牙语 |
cp861 | 861, CP-IS, IBM861 | 冰岛语 |
cp862 | 862, IBM862 | 希伯来语 |
cp863 | 863, IBM863 | 加拿大语 |
cp864 | IBM864 | 阿拉伯语 |
cp865 | 865, IBM865 | 丹麦语/挪威语 |
cp866 | 866, IBM866 | 俄语 |
cp869 | 869, CP-GR, IBM869 | 希腊语 |
cp874 | 泰语 | |
cp875 | 希腊语 | |
cp932 | 932, ms932, mskanji, ms-kanji | 日语 |
cp949 | 949, ms949, uhc | 韩语 |
cp950 | 950, ms950 | 繁体中文 |
cp1006 | 乌尔都语 | |
cp1026 | ibm1026 | 土耳其语 |
cp1125 | 1125, ibm1125, cp866u, ruscii | 乌克兰语3.4 新版功能. |
cp1140 | ibm1140 | 西欧 |
cp1250 | windows-1250 | 中欧和东欧 |
cp1251 | windows-1251 | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
cp1252 | windows-1252 | 西欧 |
cp1253 | windows-1253 | 希腊语 |
cp1254 | windows-1254 | 土耳其语 |
cp1255 | windows-1255 | 希伯来语 |
cp1256 | windows-1256 | 阿拉伯语 |
cp1257 | windows-1257 | 波罗的海语言 |
cp1258 | windows-1258 | 越南语 |
euc_jp | eucjp, ujis, u-jis | 日语 |
euc_jis_2004 | jisx0213, eucjis2004 | 日语 |
euc_jisx0213 | eucjisx0213 | 日语 |
euc_kr | euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | 韩语 |
gb2312 | chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 | 简体中文 |
gbk | 936, cp936, ms936 | 统一汉语 |
gb18030 | gb18030-2000 | 统一汉语 |
hz | hzgb, hz-gb, hz-gb-2312 | 简体中文 |
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | 日语 |
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | 日语 |
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | 日语,韩语,简体中文,西欧,希腊语 |
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | 日语 |
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | 日语 |
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | 日语 |
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | 韩语 |
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 | 世界语,马耳他语 |
iso8859_4 | iso-8859-4, latin4, L4 | 波罗的海语言 |
iso8859_5 | iso-8859-5, cyrillic | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
iso8859_6 | iso-8859-6, arabic | 阿拉伯语 |
iso8859_7 | iso-8859-7, greek, greek8 | 希腊语 |
iso8859_8 | iso-8859-8, hebrew | 希伯来语 |
iso8859_9 | iso-8859-9, latin5, L5 | 土耳其语 |
iso8859_10 | iso-8859-10, latin6, L6 | 北欧语言 |
iso8859_11 | iso-8859-11, thai | 泰语 |
iso8859_13 | iso-8859-13, latin7, L7 | 波罗的海语言 |
iso8859_14 | iso-8859-14, latin8, L8 | 凯尔特语 |
iso8859_15 | iso-8859-15, latin9, L9 | 西欧 |
iso8859_16 | iso-8859-16, latin10, L10 | 东南欧 |
johab | cp1361, ms1361 | 韩语 |
koi8_r | 俄语 | |
koi8_t | 塔吉克3.5 新版功能. | |
koi8_u | 乌克兰语 | |
kz1048 | kz_1048, strk1048_2002, rk1048 | 哈萨克语3.5 新版功能. |
mac_cyrillic | maccyrillic | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
mac_greek | macgreek | 希腊语 |
mac_iceland | maciceland | 冰岛语 |
mac_latin2 | maclatin2, maccentraleurope | 中欧和东欧 |
mac_roman | macroman, macintosh | 西欧 |
mac_turkish | macturkish | 土耳其语 |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | 哈萨克语 |
shift_jis | csshiftjis, shiftjis, sjis, s_jis | 日语 |
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | 日语 |
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | 日语 |
utf_32 | U32, utf32 | 所有语言 |
utf_32_be | UTF-32BE | 所有语言 |
utf_32_le | UTF-32LE | 所有语言 |
utf_16 | U16, utf16 | 所有语言 |
utf_16_be | UTF-16BE | 所有语言 |
utf_16_le | UTF-16LE | 所有语言 |
utf_7 | U7, unicode-1-1-utf-7 | 所有语言 |
utf_8 | U8, UTF, utf8, cp65001 | 所有语言 |
utf_8_sig | 所有语言 |
在 3.4 版更改: utf-16* 和 utf-32* 编码器将不再允许编码代理码位 (U+D800
–U+DFFF
)。 utf-32* 解码器将不再解码与代理码位相对应的字节序列。
在 3.8 版更改: cp65001
现在是 utf_8
的一个别名。
Python 专属的编码格式
有一些预定义编解码器是 Python 专属的,因此它们在 Python 之外没有意义。 这些编解码器按其所预期的输入和输出类型在下表中列出(请注意虽然文本编码是编解码器最常见的使用场景,但下层的编解码器架构支持任意数据转换而不仅是文本编码)。 对于非对称编解码器,该列描述的含义是编码方向。
文字编码
以下编解码器提供了 str
到 bytes
的编码和 bytes-like object 到 str
的解码,类似于 Unicode 文本编码。
编码 | 别名 | 含义 |
---|---|---|
idna | 实现 RFC 3490,另请参阅 encodings.idna 。仅支持 errors='strict' 。 | |
mbcs | ansi, dbcs | Windows 专属:根据 ANSI 代码页(CP_ACP)对操作数进行编码。 |
oem | Windows 专属:根据 OEM 代码页(CP_OEMCP)对操作数进行编码。3.6 新版功能. | |
palmos | PalmOS 3.5 的编码格式 | |
punycode | 实现 RFC 3492。 不支持有状态编解码器。 | |
raw_unicode_escape | Latin-1 编码格式附带对其他码位以 \uXXXX 和 \UXXXXXXXX 进行编码。 现有反斜杠不会以任何方式转义。 它被用于 Python 的 pickle 协议。 | |
undefined | 所有转换都将引发异常,甚至对空字符串也不例外。 错误处理方案会被忽略。 | |
unicode_escape | 适合用于以 ASCII 编码的 Python 源代码中的 Unicode 字面值内容的编码格式,但引号不会被转义。 对 Latin-1 源代码进行解码。 请注意 Python 源代码实际上默认使用 UTF-8。 |
在 3.8 版更改: “unicode_internal” 编解码器已被移除。
二进制转换
以下编解码器提供了二进制转换: bytes-like object 到 bytes
的映射。 它们不被 bytes.decode()
所支持(该方法只生成 str
类型的输出)。
编码 | 别名 | 含义 | 编码器/解码器 |
---|---|---|---|
base64_codec 1 | base64, base_64 | 将操作数转换为多行 MIME base64 (结果总是包含一个末尾的 '\n' )在 3.4 版更改: 接受任意 bytes-like object 作为输入用于编码和解码 | base64.encodebytes() / base64.decodebytes() |
bz2_codec | bz2 | 使用bz2压缩操作数 | bz2.compress() / bz2.decompress() |
hex_codec | hex | 将操作数转换为十六进制表示,每个字节有两位数 | binascii.b2a_hex() / binascii.a2b_hex() |
quopri_codec | quopri, quotedprintable, quoted_printable | 将操作数转换为 MIME 带引号的可打印数据 | quopri.encode() 且 quotetabs=True / quopri.decode() |
uu_codec | uu | 使用uuencode转换操作数 | uu.encode() / uu.decode() |
zlib_codec | zip, zlib | 使用gzip压缩操作数 | zlib.compress() / zlib.decompress() |
3.2 新版功能: 恢复二进制转换。
在 3.4 版更改: 恢复二进制转换的别名。
文字转换
以下编解码器提供了文本转换: str
到 str
的映射。 它不被 str.encode()
所支持(该方法只生成 bytes
类型的输出)。
编码 | 别名 | 含义 |
---|---|---|
rot_13 | rot13 | 返回操作数的凯撒密码加密结果 |
3.2 新版功能: 恢复 rot_13
文本转换。
在 3.4 版更改: 恢复 rot13
别名。
encodings.idna
— 应用程序中的国际化域名
此模块实现了 RFC 3490 (应用程序中的国际化域名) 和 RFC 3492 (Nameprep: 用于国际化域名 (IDN) 的 Stringprep 配置文件)。 它是在 punycode
编码格式和 stringprep
的基础上构建的。
这些 RFC 共同定义了一个在域名中支持非 ASCII 字符的协议。 一个包含非 ASCII 字符的域名 (例如 www.Alliancefrançaise.nu
) 会被转换为兼容 ASCII 的编码格式 (简称 ACE,例如 www.xn--alliancefranaise-npb.nu
)。 随后此域名的 ACE 形式可以用于所有由于特定协议而不允许使用任意字符的场合,例如 DNS 查询,HTTP Host 字段等等。 此转换是在应用中进行的;如有可能将对用户可见:应用应当透明地将 Unicode 域名标签转换为线上的 IDNA,并在 ACE 标签被呈现给用户之前将其转换回 Unicode。
Python 以多种方式支持这种转换: idna
编解码器执行 Unicode 和 ACE 之间的转换,基于在 section 3.1 of RFC 3490 中定义的分隔字符将输入字符串拆分为标签,再根据需要将每个标签转换为 ACE,相反地又会基于 .
分隔符将输入字节串拆分为标签,再将找到的任何 ACE 标签转换为 Unicode。 此外,socket
模块可透明地将 Unicode 主机名转换为 ACE,以便应用在将它们传给 socket 模块时无须自行转换主机名。 除此之外,许多包含以主机名作为函数参数的模块例如 http.client
和 ftplib
都接受 Unicode 主机名(并且 http.client
也会在 Host 字段中透明地发送 IDNA 主机名,如果它需要发送该字段的话)。
当从线路接收主机名时(例如反向名称查找),到 Unicode 的转换不会自动被执行:希望向用户提供此种主机名的应用应当将它们解码为 Unicode。
encodings.idna
模块还实现了 nameprep 过程,该过程会对主机名执行特定的规范化操作,以实现国际域名的大小写不敏感特性与合并相似的字符。 如果有需要可以直接使用 nameprep 函数。
-
encodings.idna.``nameprep
(label)返回 label 经过名称处理操作的版本。 该实现目前基于查询字符串,因此
AllowUnassigned
为真值。 -
encodings.idna.``ToASCII
(label)将标签转换为 ASCII,规则定义见 RFC 3490。
UseSTD3ASCIIRules
预设为假值。 -
encodings.idna.``ToUnicode
(label)将标签转换为 Unicode,规则定义见 RFC 3490。
encodings.mbcs
— Windows ANSI代码页
此模块实现ANSI代码页(CP_ACP)。
Availability: 仅Windows可用
在 3.3 版更改: 支持任何错误处理
在 3.2 版更改: 在 3.2 版之前, errors 参数会被忽略;总是会使用 'replace'
进行编码,并使用 'ignore'
进行解码。
encodings.utf_8_sig
— 带BOM签名的UTF-8编解码器
此模块实现了 UTF-8 编解码器的一个变种:在编码时将把 UTF-8 已编码 BOM 添加到 UTF-8 编码字节数据的开头。 对于有状态编码器此操作只执行一次(当首次写入字节流时)。 在解码时将跳过数据开头作为可选项的 UTF-8 已编码 BOM。